您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > C++发送邮件和附件
C++发送邮件和附件头文件[cpp]viewplaincopy/************************************************************************发送邮件模块头文件*可以发送文本和附件(支持多个附件一起发送)*************************************************************************/#pragmaoncestructsMailInfo//邮件信息{char*m_pcUserName;//用户登录邮箱的名称char*m_pcUserPassWord;//用户登录邮箱的密码char*m_pcSenderName;//用户发送时显示的名称char*m_pcSender;//发送者的邮箱地址char*m_pcReceiver;//接收者的邮箱地址char*m_pcTitle;//邮箱标题char*m_pcBody;//邮件文本正文char*m_pcIPAddr;//服务器的IPchar*m_pcIPName;//服务器的名称(IP与名称二选一,优先取名称)sMailInfo(){memset(this,0,sizeof(sMailInfo));}};classCSendMail{public:CSendMail(void);~CSendMail(void);public:boolSendMail(sMailInfo&smailInfo);//发送邮件,需要在发送的时候初始化邮件信息voidAddFilePath(char*pcFilePath);//添加附件的决定路径到附件列表中voidDeleteFilePath(char*pcFilePath);//删除附件路径,如果有的话voidDeleteAllPath(void);//删除全部附件的路径protected:voidGetFileName(char*fileName,char*filePath);//从附件的路径中获取文件名称voidChar2Base64(char*pBuff64,char*pSrcBuff,intiLen);//把char类型转换成Base64类型boolCReateSocket(SOCKET&sock);//建立socket连接boolLogon(SOCKET&sock);//登录邮箱,主要进行发邮件前的准备工作intGetFileData(char*FilePath);//由文件路径获取附件内容boolSendHead(SOCKET&sock);//发送邮件头boolSendTextBody(SOCKET&sock);//发送邮件文本正文boolSendFileBody(SOCKET&sock);//发送邮件附件boolSendEnd(SOCKET&sock);//发送邮件结尾protected:CListchar*,char*m_pcFilePathList;//记录附件路径charm_cSendBuff[4096];//发送缓冲区charm_cReceiveBuff[1024];char*m_pcFileBuff;//指向附件内容sMailInfom_sMailInfo;};模块实现文件[cpp]viewplaincopy/*************************************************************************发送邮件模块*可以发送文本和附件(支持多个附件一起发送)*Date:2011-12-01************************************************************************/#includeStdAfx.h#includeSendMail.h#includewinsock2.h#pragmacomment(lib,WSOCK32)CSendMail::CSendMail(void){m_pcFileBuff=NULL;memset(m_cSendBuff,0,sizeof(m_cSendBuff));memset(m_cReceiveBuff,0,sizeof(m_cReceiveBuff));}CSendMail::~CSendMail(void){DeleteAllPath();}voidCSendMail::Char2Base64(char*pBuff64,char*pSrcBuff,intiLen){//11111111//分配给pBuff64↑分配给pBuff64+1//point所在的位置staticcharBase64Encode[]=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/;//base64所映射的字符表intpoint;//每一个源字符拆分的位置,可取2,4,6;初始为2point=2;inti;intiIndex;//base64字符的索引charn=0;//上一个源字符的残留值for(i=0;iiLen;i++){if(point==2){iIndex=((*pSrcBuff)point)&0x3f;//取得pSrcBuff的高point位}elseif(point==4){iIndex=((*pSrcBuff)point)&0xf;//取得pSrcBuff的高point位}elseif(point==6){iIndex=((*pSrcBuff)point)&0x3;//取得pSrcBuff的高point位}iIndex+=n;//与pSrcBuff-1的低point结合组成Base64的索引*pBuff64++=Base64Encode[iIndex];//由索引表得到pBuff64n=((*pSrcBuff)(6-point));//计算源字符中的残留值n=n&0x3f;//确保n的最高两位为0point+=2;//源字符的拆分位置上升2if(point==8)//如果拆分位置为8说明pSrcBuff有6位残留,可以组成一个完整的Base64字符,所以直接再组合一次{iIndex=(*pSrcBuff)&0x3f;//提取低6位,这就是索引了*pBuff64++=Base64Encode[iIndex];//n=0;//残留值为0point=2;//拆分位置设为2}pSrcBuff++;}if(n!=0){*pBuff64++=Base64Encode[n];}if(iLen%3==2)//如果源字符串长度不是3的倍数要用'='补全{*pBuff64='=';}elseif(iLen%3==1){*pBuff64++='=';*pBuff64='=';}}voidCSendMail::AddFilePath(char*pcFilePath)//添加附件路径{if(pcFilePath==NULL){return;}inti;char*temp;for(i=0;im_pcFilePathList.GetCount();i++){temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));if(strcmp(pcFilePath,temp)==0)//如果已经存在就不用再添加了{return;}}m_pcFilePathList.AddTail(pcFilePath);}voidCSendMail::DeleteFilePath(char*pcFilePath)//删除附件路径{inti;char*temp;for(i=0;im_pcFilePathList.GetCount();i++){temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i));if(strcmp(temp,pcFilePath)==0)//找到并删除它,如果没找到就算了{m_pcFilePathList.RemoveAt(m_pcFilePathList.FindIndex(i));delete[]temp;return;}}}voidCSendMail::DeleteAllPath(void){m_pcFilePathList.RemoveAll();}intCSendMail::GetFileData(char*FilePath){m_pcFileBuff=NULL;if(FilePath==NULL){return0;}CFilef;intlen;USES_CONVERSION;if(!f.Open(A2W(FilePath),CFile::modeRead|CFile::modeNoTruncate|CFile::typeBinary)){return0;}len=(int)f.GetLength();m_pcFileBuff=newchar[len+1];memset(m_pcFileBuff,0,len+1);f.Read(m_pcFileBuff,len);f.Close();returnlen;}voidCSendMail::GetFileName(char*fileName,char*filePath){if(filePath==NULL||fileName==NULL){return;}inti;for(i=0;i(int)strlen(filePath);i++){if(filePath[strlen(filePath)-1-i]=='\\'){memcpy(fileName,&filePath[strlen(filePath)-i],i);return;}}}boolCSendMail::CReateSocket(SOCKET&sock){WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(2,2);err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){returnfalse;}if(LOBYTE(wsaData.wVersion)!=2||HIBYTE(wsaData.wVersion)!=2){WSACleanup();returnfalse;}sock=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);if(sock=
本文标题:C++发送邮件和附件
链接地址:https://www.777doc.com/doc-7293476 .html