C++发送邮件和附件
头文件
? ? ? ? ? ? ? ? ?
/*********************************************************************** *发送邮件模块头文件
*可以发送文本和附件(支持多个附件一起发送)
*************************************************************************/ #pragma once
struct sMailInfo //邮件信息 {
char* m_pcUserName;//用户登录邮箱的名称 char* m_pcUserPassWord;//用户登录邮箱的密码
?? char* m_pcSenderName;//用户发送时显示的名称 ?? char* m_pcSender;//发送者的邮箱地址 ?? char* m_pcReceiver;//接收者的邮箱地址 ?? char* m_pcTitle;//邮箱标题 ?? char* m_pcBody;//邮件文本正文 ?? char* m_pcIPAddr;//服务器的IP
?? char* m_pcIPName;//服务器的名称(IP与名称二选一,优先取名称) ?? sMailInfo(){memset(this,0,sizeof(sMailInfo));} ?? };
?? class CSendMail ?? { ?? public:
?? CSendMail(void); ?? ~CSendMail(void); ?? ?? public:
?? bool SendMail(sMailInfo &smailInfo);//发送邮件,需要在发送的时候初始化邮件信息
?? void AddFilePath(char * pcFilePath);//添加附件的决定路径到附件列表中 ?? void DeleteFilePath(char* pcFilePath);//删除附件路径,如果有的话 ?? void DeleteAllPath(void);//删除全部附件的路径 ??
?? protected:
?? void GetFileName(char* fileName,char* filePath);//从附件的路径中获取文件名称 ?? void Char2Base64(char* pBuff64,char* pSrcBuff,int iLen);//把char类型转换成Base64类型
?? bool CReateSocket(SOCKET &sock);//建立socket连接
?? bool Logon(SOCKET &sock);//登录邮箱,主要进行发邮件前的准备工作
?? int GetFileData(char* FilePath);//由文件路径获取附件内容 ??
?? bool SendHead(SOCKET &sock);//发送邮件头
?? bool SendTextBody(SOCKET &sock);//发送邮件文本正文 ?? bool SendFileBody(SOCKET &sock);//发送邮件附件 ?? bool SendEnd(SOCKET &sock);//发送邮件结尾 ?? protected:
?? CList
?? char m_cSendBuff[4096];//发送缓冲区 ?? char m_cReceiveBuff[1024]; ?? char* m_pcFileBuff;//指向附件内容 ?? sMailInfo m_sMailInfo; ?? };
模块实现文件
?? /************************************************************************ ?? * 发送邮件模块
?? *可以发送文本和附件(支持多个附件一起发送) ?? *Date:2011-12-01
?? ************************************************************************/ ?? #include \ ?? #include \ ?? #include \
?? #pragma comment(lib,\ ??
?? CSendMail::CSendMail(void) ?? {
?? m_pcFileBuff=NULL;
?? memset(m_cSendBuff,0,sizeof(m_cSendBuff)); ?? memset(m_cReceiveBuff,0,sizeof(m_cReceiveBuff)); ?? } ?? ??
?? CSendMail::~CSendMail(void) ?? {
?? DeleteAllPath(); ?? } ?? ??
?? void CSendMail::Char2Base64(char* pBuff64,char* pSrcBuff,int iLen)
?? {
?? //1 1 1 1 1 1 1 1 ?? // 分配给pBuff64 ↑ 分配给pBuff64+1 ?? // point所在的位置 ?? static char Base64Encode[] =
\;//base64所映射的字符表
?? int point;//每一个源字符拆分的位置,可取2,4,6;初始为2 ?? point=2; ?? int i;
?? int iIndex;//base64字符的索引 ?? char n=0;//上一个源字符的残留值 ?? for(i=0;i ?? if(point==2) ?? { ?? iIndex=((*pSrcBuff)>>point)&0x3f;//取得pSrcBuff的高point位 ?? } ?? else if (point==4) ?? { ?? iIndex=((*pSrcBuff)>>point)&0xf;//取得pSrcBuff的高point位 ?? } ?? else if(point==6) ?? { ?? iIndex=((*pSrcBuff)>>point)&0x3;//取得pSrcBuff的高point位 ?? } ?? iIndex+=n;//与pSrcBuff-1的低point结合组成Base64的索引 ??? *pBuff64++=Base64Encode[iIndex];//由索引表得到pBuff64 ??? n=((*pSrcBuff)<<(6-point));//计算源字符中的残留值 ??? n=n&0x3f;//确保n的最高两位为0 ??? point+=2;//源字符的拆分位置上升2 ??? if(point==8)//如果拆分位置为8说明pSrcBuff有6位残留,可以组成一个完整的Base64字符,所以直接再组合一次 ??? { ??? iIndex=(*pSrcBuff)&0x3f;//提取低6位,这就是索引了 ??? *pBuff64++=Base64Encode[iIndex];// ??? n=0;//残留值为0 ??? point=2;//拆分位置设为2 ??? } ??? pSrcBuff++; ??? ??? } ??? if(n!=0) ??? { ??? *pBuff64++=Base64Encode[n]; ??? } ??? if(iLen%3==2)//如果源字符串长度不是3的倍数要用'='补全 ??? { ??? *pBuff64='='; ??? } ??? else if(iLen%3==1) ??? { ??? *pBuff64++='='; ??? *pBuff64='='; ??? } ??? } ??? ??? void CSendMail::AddFilePath(char * pcFilePath)//添加附件路径 ??? { ??? if(pcFilePath==NULL) ??? { ??? return; ??? } ??? int i; ??? char* temp; ??? for(i=0;i ??? temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i)); ??? if(strcmp(pcFilePath,temp)==0)//如果已经存在就不用再添加了 ??? { ??? return; ??? } ??? } ??? m_pcFilePathList.AddTail(pcFilePath); ??? } ??? ??? void CSendMail::DeleteFilePath(char* pcFilePath)//删除附件路径 ??? { ??? int i; ??? char* temp; ??? for(i=0;i ??? temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i)); ??? if(strcmp(temp,pcFilePath)==0)//找到并删除它,如果没找到就算了 ??? { ??? m_pcFilePathList.RemoveAt(m_pcFilePathList.FindIndex(i)); ??? delete[] temp; ??? return; ??? } ??? } ??? } ??? ??? ??? void CSendMail::DeleteAllPath(void) ??? { ??? m_pcFilePathList.RemoveAll(); ??? } ??? ??? int CSendMail::GetFileData(char* FilePath) ??? { ??? m_pcFileBuff=NULL; ??? if(FilePath==NULL) ??? { ??? return 0; ??? } ??? CFile f; ??? int len; ??? ??? ??? USES_CONVERSION; ??? if(!f.Open(A2W(FilePath),CFile::modeRead|CFile::modeNoTruncate|CFile::typeBinary)) ??? { ??? return 0; ??? } ??? len=(int)f.GetLength(); ??? m_pcFileBuff=new char[len+1]; ??? memset(m_pcFileBuff,0,len+1); ??? f.Read(m_pcFileBuff,len); ??? ??? f.Close(); ??? return len; ??? } ??? ??? void CSendMail::GetFileName(char* fileName,char* filePath) ??? { ??? if(filePath==NULL || fileName==NULL) ??? { ??? return; ??? } ??? int i;