从给定的字符串中解析出邮件地址(以";"分隔)

从给定的字符串中解析出邮件地址(以";"分隔)

 


 vector<CString> m_MailAddr;  // 储存解析出来的邮箱地址

 

/* *@函数名:ParseMailAddress() *@参数: CString &strMailAddr [in] 邮件地址列表,以";"分隔 *@作用: 解析将要发送邮件的目标邮箱地址"链"是否正确,提供单个邮件地址 *@返回值: int 型 >0 — 解析成功,解析出部分或全部邮件地址,返回解析到的邮件地址个数 <=0 — 小于零,数据有误;等于零,一个有效邮箱地址都没有解析到 */ int CMailSender::ParseMailAddress(CString &strMailAddr) { strMailAddr.TrimLeft();strMailAddr.TrimRight(); if(strMailAddr.IsEmpty()) return -1; int nCount=0; // 如果没有错误,解析出的有效的email地址个数 CString strTemp=strMailAddr; // 邮件地址列表 CString strTemp2=""; CString strSingle=""; // 单个邮件地址 // 确保邮件地址列表左侧第一个字符不是";" while(strTemp.GetAt(0)==';') { strTemp2.Empty(); strTemp2=strTemp.Mid(1,strTemp.GetLength()-1); strTemp.Empty(); strTemp=strTemp2; } // 判断邮件地址列表最后一个字符是否是分号";",如果不是,就添加一个 // 从而保证处理的邮件地址列表为: // xx;xx;[email protected];yy;yy;[email protected];xx;xx;xx;xx;yy;zz;... if(strTemp.GetAt(strTemp.GetLength()-1)!=';') strTemp += ";"; int nStartIndex = 0; // 记录当前获取的email地址前的第一个";"在整个email地址链中的索引 int nEndIndex = 0; // 记录当前获取的email地址后的第一个";"在整个email地址链中的索引 nEndIndex=strTemp.Find(';',0); // 整个字符串一个';'分隔都没有(一般不会出现,因为前面已经判断了) if(nEndIndex<0) return -1; // 使用通用的循环来解析 while(1) { // 保证进行if()语句后,不会碰到查找';'过界的现象, if(strTemp.GetLength()-1>nStartIndex) { nEndIndex=strTemp.Find(';',nStartIndex); strSingle.Empty(); strTemp2.Empty(); // strTemp2中储存的形式为: "[email protected];"或"xx;" strTemp2=strTemp.Mid(nStartIndex,nEndIndex-nStartIndex+1); strTemp2.TrimLeft();strTemp2.TrimRight(); // strSingle中储存的形式为: "[email protected]"或"xx"或"yy" strSingle=strTemp2.Left(strTemp2.GetLength()-1); strSingle.TrimLeft();strSingle.TrimRight(); if((strSingle.IsEmpty()&&nEndIndex>=strTemp.GetLength()-1)) return nCount; // 得到的email段为空且是最后一个email字段 else if(ParseAddress(strSingle)<0&&nEndIndex>=strTemp.GetLength()-1) return nCount; // 得到的email段不符合email格式且是最后一个email字段 else if(ParseAddress(strSingle)<0&&nEndIndex<strTemp.GetLength()-1) { /* 说明得到的email字段不符合email格式,但是此email字 段又不是最后一个email字段 */ nStartIndex=nEndIndex+1; continue; } m_MailAddr.push_back(strSingle); nCount++; nStartIndex=nEndIndex+1; } else return nCount; } return nCount; } /* *@函数名:ParseAddress() *@参数: CString &strMailAddr [in] *@作用: 解析单个邮件地址是否符合:[email protected].....的格式 *@返回值: int 型 >0 — 解析成功,没有出现错误 <0 — 解析失败,邮箱地址不符合规范 */ int CMailSender::ParseAddress(CString &strMailAddr) { CString strTemp=strMailAddr; /* *简单的判断字符串是否是邮箱地址: *1、字符串中必须有'@',且'@'不是第一个字符 *2、在'@'后必须有'.',并且'@'与'.'之间有其他字符 *3、'.'不是字符串的最后一个字符 */ int nEitaIndex=0; // '@'的索引值 int nDianIndex=0; // '.'的索引值 nEitaIndex=strTemp.Find('@',0); if(nEitaIndex<0||nEitaIndex==0) // 没有'@'或'@'是第一个字符 return -1; nDianIndex=strTemp.Find('.',nEitaIndex); // 没有'.'或'@'与'.'之间没有字符或字符串的最后一个字符不是'.' if(nDianIndex<0||(nDianIndex-nEitaIndex)<=1||/ (strTemp.GetAt(strTemp.GetLength()-1)=='.')) return -1; return 1; }

你可能感兴趣的:(email)