


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+发送邮件和附件C+发送邮件和附件头文件/* *发送邮件模块头文件*可以发送文本和附件(支持多个附件一起发送)*/#pragma once struct sMaillnfo /邮件信息 char* m_pcUserName;用户登录邮箱的名称char* m_pcUserPassWord;用户登录邮箱的密码char* m_pcSe nderName;/ 用户发送时显示的名称char* m_pcSe nder;/发送者的邮箱地址char* m_pcReceiver;接收者的邮箱地址char* m_pcTitle;邮箱标题char* m_pcBody; 邮件文本正文char* m_pclPAddr
2、; 效劳器的 IPchar* m_pclPName; 效劳器的名称(IP与名称二选一,优先取名称)sMailI nfo()memset(this,O,sizeof(sMaill nfo);class CSe ndMailpublic:CSe ndMail(void);CSe ndMail(void);public:bool Sen dMail(sMaill nfo &smaill nfo);发送邮件,需要在发送的时候初始化邮件信息添加附件的决定路径到附件列表中删除附件路径,如果有的话void AddFilePath(char * pcFilePath);/void DeleteFile
3、Path(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 Logo n(SOCKET & sock);/登录邮箱,主要进行发邮件
4、前的准备工作int GetFileData(char* FilePath);/由文件路径获取附件内容bool Sen dHead(SOCKET &sock);/ 发送邮件头bool Sen dTextBody(SOCKET & sock);/发送邮件文本正文bool Se ndFileBody(SOCKET &sock);/发送邮件附件bool SendEn d(SOCKET & sock);/ 发送邮件结尾protected:char m_cSe ndBuf4096;发送缓冲区char m_cReceiveBuf1024;char* m_pcFileBuff;
5、指向附件内容sMaill nfo m_sMaill nfo;;模块实现文件/* *发送邮件模块*可以发送文本和附件(支持多个附件一起发送)*Date:2021-12-01*/#i nclude#in clude#in clude#pragma comme nt(lib,CSe ndMail:CSe ndMail(void)m_pcFileBuff=NULL;memset(m_cSe ndBuf,0,sizeof(m_cSe ndBuff);memset(m_cReceiveBuf,0,sizeof(m_cReceiveBuff);CSe ndMail:CSe ndMail(void) Dele
6、teAIIPath();void CSe ndMail:Char2Base64(char* pBuff64,char* pSrcBuff,i nt iLe n)1 1 1 1 1 1 1 1/ 分配给 pBuff64 T 分配给 pBuff64+1/ poi nt所在的位置static char Base64E ncode=int point;每一个源字符拆分的位置,可取2,4,6 ;初始为2poin t=2;int i;int iIn dex;/base64字符的索引char n=0;/上一个源字符的残留值for(i=0;iif(po in t=2)iIndex=(*pSrcBuff)
7、87;point)&0x3f;取得 pSrcBuff 的高 point 位 else if (po in t=4)iln dex=(*pSrcBuff)»poi nt)&Oxf;取得pSrcBuff的高point位else if(po in t=6)ilndex=(*pSrcBuff)>>point)&0x3;/取得 pSrcBuff 的高 point 位 ilndex+=n;与 pSrcBuff-1 的低 point 结合组成 Base64 的索引*pBuff64+=Base64E ncodeil ndex;/由索引表得到 pBuff64n=(*
8、pSrcBuff)n=n&0x3f; 确保n的最高两位为 0poi nt+=2;源字符的拆分位置上升 2if(point=8)如果拆分位置为 8说明pSrcBuff有6位残留,可以组成一个完整的Base64字符,所以直接再组合一次iIndex=(*pSrcBuff)&0x3f;提取低 6 位,这就是索引了*pBuff64+=Base64E ncodeil ndex;/n=0;/残留值为0point=2;拆分位置设为2pSrcBuff+;if(n !=0)*pBuff64+=Base64E ncode n;if(iLen%3=2)如果源字符串长度不是3的倍数要用'=
9、9;补全*pBuff64='=:else if(iLe n%3=1)*pBuff64+='=:*pBuff64='='void CSe ndMail:AddFilePath(char * pcFilePath)/添加附件路径if(pcFilePath=NULL)return;int i;char* temp;for(i=0;itemp=m_pcFilePathList.GetAt(m_pcFilePathList.Fi ndln dex(i); if(strcmp(pcFilePath,temp)=O)如果已经存在就不用再添加了return;删除附件路径m_pc
10、FilePathList.AddTail(pcFilePath);void CSe ndMail:DeleteFilePath(char* pcFilePath)/int i;char* temp;for(i=0;itemp=m_pcFilePathList.GetAt(m_pcFilePathList.Fi ndln dex(i);if(strcmp(temp,pcFilePath)=O)找到并删除它,如果没找到就算了m_pcFilePathList.RemoveAt(m_pcFilePathList.F in dI ndex(i); delete temp;return; void CSe
11、 ndMail:DeleteAIIPath(void)m_pcFilePathList.RemoveAII();int CSe ndMail:GetFileData(char* FilePath) m_pcFileBuff=NULL;if(FilePath=NULL)return 0;CFile f;int len;USES_CONVERSION;if(!f.Ope n(A2W(FilePath),CFile:modeRead|CFile:modeNoTru ncate|CFile:typeB ina ry)return 0;len=(i nt)f.GetLe ngth();m_pcFileB
12、uff= new charle n+1;memset(m_pcFileBuff,O,le n+1);f.Read(m_pcFileBuff,le n);f.Close();return len;void CSe ndMail:GetFileName(char* fileName,char* filePath)if(filePath=NULL | fileName=NULL)return;int i;for(i=0;iif(filePathstrle n(filePath)-1-i='')memcpy(fileName, &filePathstrle n(filePath
13、)-i,i);return;bool CSe ndMail:CReateSocket(SOCKET & sock)WORD wVersio nRequested;WSADATA wsaData;int err;wVersio nRequested = MAKEWORD( 2, 2 );err = WSAStartup( wVersio nRequested, &wsaData );if ( err != 0 )return false;if ( LOBYTE( wsaData.wVersio n ) != 2 |HIBYTE( wsaData.wVersio n ) != 2
14、)WSAClea nup();return false;sock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);if (sock = INVALID_SOCKET)return false; sockaddr_ in servaddr;memset (&servaddr,0,sizeof(sockaddr_i n);servaddr.sin_family = AF_INET;servaddr.sin_port = htons(25);发邮件一般都是 25 端口if(m_sMaill nfo.m_pclPName=servaddr.s in _addr
15、.s_addr = in et_addr(m_sMaill nfo.m_pclPAddr);使用IP地址 elsestruct hoste nt *hp=gethostb yn ame(m_sMaill nfo.m_pclPName); servaddr.s in _addr.s_addr=*(i nt*)(*hp->h_addr_list);直接使用名称立连接if (ret = SOCKET_ERROR)int ret = conn ect(sock,(sockaddr* )& servaddr,sizeof(servaddr);return false;return true
16、; bool CSe ndMail:Logo n(SOCKET &sock)recv(sock,m_cReceiveBuff,1024,0);sen d(sock,m_cSe ndBuf,strle n(m_cSe ndBuff),O);开始会话recv(sock,m_cReceiveBuff,1024,0);if(m_cReceiveBuff0!=2 | m_cReceiveBuff1!='5' | m_cReceiveBuff2!='O')return false;memset(m_cSe ndBuf,0,sizeof(m_cSe ndBuff);s
17、pri ntf_s(m_cSe ndBuff,sen d(sock,m_cSe ndBuf,strle n(m_cSe ndBuff),O);请求登录recv(sock,m_cReceiveBuff,1024,0);if(m_cReceiveBuff0!=3 | m_cReceiveBuff1!=3 | m_cReceiveBuff2!='4')return false;memset(m_cSe ndBuf,0,sizeof(m_cSe ndBuff);Char2Base64(m_cSe ndBuf,m_sMaill nfo.m_pcUserName,strle n(m_sMa
18、ill nfo.m_pcUserNa me);m_cSe ndBuffstrle n(m_cSe ndBuff)='r:m_cSe ndBuffstrle n(m_cSe ndBuff)='n:sen d(sock,m_cSe ndBuf,strle n(m_cSe ndBuff),O);发送用户名recv(sock,m_cReceiveBuff,1024,0);if(m_cReceiveBuff0!=3 | m_cReceiveBuff1!=3 | m_cReceiveBuff2!='4')return false;memset(m_cSe ndBuf,0,s
19、izeof(m_cSe ndBuff);Char2Base64(m_cSe ndBuf,m_sMaill nfo.m_pcUserPassWord,strle n(m_sMaill nfo.m_pcUs erPassWord);m_cSe ndBuffstrle n(m_cSe ndBuff)='r'm_cSe ndBuffstrle n(m_cSe ndBuff)='n'sen d(sock,m_cSe ndBuf,strle n(m_cSe ndBuff),O);发送用户密码recv(sock,m_cReceiveBuff,1024,0);if(m_cRec
20、eiveBuff0!='2' | m_cReceiveBuff1!=3 | m_cReceiveBuff2!='5')return false;return true;/登录成功bool CSe ndMail:Se ndHead(SOCKET &sock)int rt;memset(m_cSe ndBuf,0,sizeof(m_cSe ndBuff);spri ntf_s(m_cSe ndBuff,if(rt!=strle n(m_cSe ndBuff)return false;recv(sock,m_cReceiveBuff,1024,0);memse
21、t(m_cSe ndBuf,0,sizeof(m_cSe ndBuff);spri ntf_s(m_cSe ndBuff,if(rt!=strle n(m_cSe ndBuff)return false;recv(sock,m_cReceiveBuff,1024,0);memset(m_cSe ndBuf,0,sizeof(m_cSe ndBuff); memcpy(m_cSe ndBuff,rt=se nd(sock,m_cSe ndBuff,strle n(m_cSe ndBuff),O);if(rt!=strle n(m_cSe ndBuff)return false;recv(sock
22、,m_cReceiveBuff,1024,0);memset(m_cSe ndBuff,0,sizeof(m_cSe ndBuff);spri ntf_s(m_cSe ndBuff,spri ntf_s(&m_cSe ndBuffstrle n( m_cSe ndBuff),150,spri ntf_s(&m_cSe ndBuffstrle n( m_cSe ndBuff),150,rt=se nd(sock,m_cSe ndBuff,strle n(m_cSe ndBuff),O);if(rt!=strle n(m_cSe ndBuff)return false;return
23、 true;bool CSe ndMail:Se ndTextBody(SOCKET &sock)int rt;memset(m_cSe ndBuf,0,sizeof(m_cSe ndBuff);spri ntf_s(m_cSe ndBuff,rt=se nd(sock,m_cSe ndBuff,strle n(m_cSe ndBuff),O); if(rt!=strle n(m_cSe ndBuff)return false;elsereturn true;bool CSe ndMail:Se ndFileBody(SOCKET &sock)int i;char* fileP
24、ath;int rt;int len;int pt=0;char fileName128;for(i=0;ipt=0;memset(fileName,0,128);filePath=m_pcFilePathList.GetAt(m_pcFilePathList.Fi ndln dex(i); len=GetFileData(filePath);GetFileName(fileName,filePath);spri ntf_s(m_cSe ndBuff,sen d(sock,m_cSe ndBuff,strle n(m_cSe ndBuff),O);while (ptmemset(m_cSe n
25、dBuff,0,sizeof(m_cSe ndBuff);Char2Base64(m_cSe ndBuff,&m _pcFileBuffpt,mi n(le n-pt,3000); m_cSe ndBuffstrle n( m_cSe ndBuff)='r:m_cSe ndBuffstrle n(m_cSe ndBuff)='n:rt=se nd(sock,m_cSe ndBuff,strle n(m_cSe ndBuff),O);pt+=mi n( le n-pt,3000);if(rt!=strle n(m_cSe ndBuff)return false;if(le n!=0)delete m_pcFileBuff;return true;bool CSe ndMail:Se ndE n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国铸铜产品市场运行现状与发展前景分析报告
- 2025-2030年中国视频监控设备行业运行动态分析与营销策略研究报告
- 2025-2030年中国肠衣市场运营状况及发展趋势分析报告
- 2025-2030年中国聚乙二醇单甲醚行业发展趋势规划分析报告
- 2025-2030年中国皮革化料行业发展趋势规划研究报告
- 戏剧院场地出租合同范本2025年
- 度专业保姆照顾老人合同范本大全
- 跨境贷款合同范本
- 幼儿园全日制托管合同范本
- 人教A版高一(下)数学必修第二册6.2.3向量的数乘运算【教学设计】
- 《自主创新对于钢结构发展的重要性》2400字
- 食品采购与进货台账
- GB/T 24353-2022风险管理指南
- GB/T 6284-2006化工产品中水分测定的通用方法干燥减量法
- GB/T 3003-2017耐火纤维及制品
- GB/T 22080-2016信息技术安全技术信息安全管理体系要求
- GB/T 13915-2013冲压件角度公差
- 制药工程导论课件
- 瑜伽师地论(完美排版全一百卷)
- 桨声灯影里的秦淮河1-课件
- 苏教版五年级下册科学知识点全册
评论
0/150
提交评论