




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C+发送邮件和附件 头文件cpp view plaincopy1 /* 2 *发送邮件模块头文件 3 *可以发送文本和附件(支持多个附件一起发送) 4 */ 5 #pragma once 6 struct sMailInfo /邮件信息 7 8 char* m_pcUserName;/用户登录邮箱的名称 9 char* m_pcUserPassWord;/用户登录邮箱的密码 10 char* m_pcSenderName;/用户发送时显示的名称 11 char* m_pcSender;/发送者的邮箱地址 12 char* m_pcReceiver;/接收者的邮箱地址 13 char* m_pcTitle;/邮箱标题 14 char* m_pcBody;/邮件文本正文 15 char* m_pcIPAddr;/服务器的IP 16 char* m_pcIPName;/服务器的名称(IP与名称二选一,优先取名称) 17 sMailInfo()memset(this,0,sizeof(sMailInfo); 18 ; 19 class CSendMail 20 21 public: 22 CSendMail(void); 23 CSendMail(void); 24 25 public: 26 bool SendMail(sMailInfo &smailInfo);/发送邮件,需要在发送的时候初始化邮件信息 27 void AddFilePath(char * pcFilePath);/添加附件的决定路径到附件列表中 28 void DeleteFilePath(char* pcFilePath);/删除附件路径,如果有的话 29 void DeleteAllPath(void);/删除全部附件的路径 30 31 protected: 32 void GetFileName(char* fileName,char* filePath);/从附件的路径中获取文件名称 33 void Char2Base64(char* pBuff64,char* pSrcBuff,int iLen);/把char类型转换成Base64类型 34 bool CReateSocket(SOCKET &sock);/建立socket连接 35 bool Logon(SOCKET &sock);/登录邮箱,主要进行发邮件前的准备工作 36 int GetFileData(char* FilePath);/由文件路径获取附件内容 37 38 bool SendHead(SOCKET &sock);/发送邮件头 39 bool SendTextBody(SOCKET &sock);/发送邮件文本正文 40 bool SendFileBody(SOCKET &sock);/发送邮件附件 41 bool SendEnd(SOCKET &sock);/发送邮件结尾 42 protected: 43 CList m_pcFilePathList;/记录附件路径 44 45 char m_cSendBuff4096;/发送缓冲区 46 char m_cReceiveBuff1024; 47 char* m_pcFileBuff;/指向附件内容 48 sMailInfo m_sMailInfo; 49 ; 模块实现文件cpp view plaincopy50 /* 51 * 发送邮件模块 52 *可以发送文本和附件(支持多个附件一起发送) 53 *Date:2011-12-01 54 */ 55 #include StdAfx.h 56 #include SendMail.h 57 #include winsock2.h 58 #pragma comment(lib,WSOCK32) 59 60 CSendMail:CSendMail(void) 61 62 m_pcFileBuff=NULL; 63 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 64 memset(m_cReceiveBuff,0,sizeof(m_cReceiveBuff); 65 66 67 68 CSendMail:CSendMail(void) 69 70 DeleteAllPath(); 71 72 73 74 void CSendMail:Char2Base64(char* pBuff64,char* pSrcBuff,int iLen) 75 76 /1 1 1 1 1 1 1 1 77 / 分配给pBuff64 分配给pBuff64+1 78 / point所在的位置 79 static char Base64Encode = ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/;/base64所映射的字符表 80 int point;/每一个源字符拆分的位置,可取2,4,6;初始为2 81 point=2; 82 int i; 83 int iIndex;/base64字符的索引 84 char n=0;/上一个源字符的残留值 85 for(i=0;ipoint)&0x3f;/取得pSrcBuff的高point位 90 91 else if (point=4) 92 93 iIndex=(*pSrcBuff)point)&0xf;/取得pSrcBuff的高point位 94 95 else if(point=6) 96 97 iIndex=(*pSrcBuff)point)&0x3;/取得pSrcBuff的高point位 98 99 iIndex+=n;/与pSrcBuff-1的低point结合组成Base64的索引 100 *pBuff64+=Base64EncodeiIndex;/由索引表得到pBuff64 101 n=(*pSrcBuff)(6-point);/计算源字符中的残留值 102 n=n&0x3f;/确保n的最高两位为0 103 point+=2;/源字符的拆分位置上升2 104 if(point=8)/如果拆分位置为8说明pSrcBuff有6位残留,可以组成一个完整的Base64字符,所以直接再组合一次 105 106 iIndex=(*pSrcBuff)&0x3f;/提取低6位,这就是索引了 107 *pBuff64+=Base64EncodeiIndex;/ 108 n=0;/残留值为0 109 point=2;/拆分位置设为2 110 111 pSrcBuff+; 112 113 114 if(n!=0) 115 116 *pBuff64+=Base64Encoden; 117 118 if(iLen%3=2)/如果源字符串长度不是3的倍数要用=补全 119 120 *pBuff64=; 121 122 else if(iLen%3=1) 123 124 *pBuff64+=; 125 *pBuff64=; 126 127 128 129 void CSendMail:AddFilePath(char * pcFilePath)/添加附件路径 130 131 if(pcFilePath=NULL) 132 133 return; 134 135 int i; 136 char* temp; 137 for(i=0;im_pcFilePathList.GetCount();i+) 138 139 temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i); 140 if(strcmp(pcFilePath,temp)=0)/如果已经存在就不用再添加了 141 142 return; 143 144 145 m_pcFilePathList.AddTail(pcFilePath); 146 147 148 void CSendMail:DeleteFilePath(char* pcFilePath)/删除附件路径 149 150 int i; 151 char* temp; 152 for(i=0;im_pcFilePathList.GetCount();i+) 153 154 temp=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i); 155 if(strcmp(temp,pcFilePath)=0)/找到并删除它,如果没找到就算了 156 157 m_pcFilePathList.RemoveAt(m_pcFilePathList.FindIndex(i); 158 delete temp; 159 return; 160 161 162 163 164 165 void CSendMail:DeleteAllPath(void) 166 167 m_pcFilePathList.RemoveAll(); 168 169 170 int CSendMail:GetFileData(char* FilePath) 171 172 m_pcFileBuff=NULL; 173 if(FilePath=NULL) 174 175 return 0; 176 177 CFile f; 178 int len; 179 180 181 USES_CONVERSION; 182 if(!f.Open(A2W(FilePath),CFile:modeRead|CFile:modeNoTruncate|CFile:typeBinary) 183 184 return 0; 185 186 len=(int)f.GetLength(); 187 m_pcFileBuff=new charlen+1; 188 memset(m_pcFileBuff,0,len+1); 189 f.Read(m_pcFileBuff,len); 190 191 f.Close(); 192 return len; 193 194 195 void CSendMail:GetFileName(char* fileName,char* filePath) 196 197 if(filePath=NULL | fileName=NULL) 198 199 return; 200 201 int i; 202 for(i=0;ih_addr_list); 247 248 249 250 int ret = connect(sock,(sockaddr*)&servaddr,sizeof(servaddr);/建立连接 251 if (ret = SOCKET_ERROR) 252 253 return false; 254 255 256 return true; 257 258 259 260 bool CSendMail:Logon(SOCKET &sock) 261 262 recv(sock,m_cReceiveBuff,1024,0); 263 264 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 265 sprintf_s(m_cSendBuff,HELO rn); 266 send(sock,m_cSendBuff,strlen(m_cSendBuff),0);/开始会话 267 recv(sock,m_cReceiveBuff,1024,0); 268 if(m_cReceiveBuff0!=2 | m_cReceiveBuff1!=5 | m_cReceiveBuff2!=0) 269 270 return false; 271 272 273 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 274 sprintf_s(m_cSendBuff,AUTH LOGINrn); 275 send(sock,m_cSendBuff,strlen(m_cSendBuff),0);/请求登录 276 recv(sock,m_cReceiveBuff,1024,0); 277 if(m_cReceiveBuff0!=3 | m_cReceiveBuff1!=3 | m_cReceiveBuff2!=4) 278 279 return false; 280 281 282 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 283 Char2Base64(m_cSendBuff,m_sMailInfo.m_pcUserName,strlen(m_sMailInfo.m_pcUserName); 284 m_cSendBuffstrlen(m_cSendBuff)=r; 285 m_cSendBuffstrlen(m_cSendBuff)=n; 286 send(sock,m_cSendBuff,strlen(m_cSendBuff),0);/发送用户名 287 recv(sock,m_cReceiveBuff,1024,0); 288 if(m_cReceiveBuff0!=3 | m_cReceiveBuff1!=3 | m_cReceiveBuff2!=4) 289 290 return false; 291 292 293 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 294 Char2Base64(m_cSendBuff,m_sMailInfo.m_pcUserPassWord,strlen(m_sMailInfo.m_pcUserPassWord); 295 m_cSendBuffstrlen(m_cSendBuff)=r; 296 m_cSendBuffstrlen(m_cSendBuff)=n; 297 send(sock,m_cSendBuff,strlen(m_cSendBuff),0);/发送用户密码 298 recv(sock,m_cReceiveBuff,1024,0); 299 if(m_cReceiveBuff0!=2 | m_cReceiveBuff1!=3 | m_cReceiveBuff2!=5) 300 301 return false; 302 303 return true;/登录成功 304 305 306 307 bool CSendMail:SendHead(SOCKET &sock) 308 309 int rt; 310 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 311 sprintf_s(m_cSendBuff,MAIL FROM:rn,m_sMailInfo.m_pcSender); 312 rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); 313 314 if(rt!=strlen(m_cSendBuff) 315 316 return false; 317 318 recv(sock,m_cReceiveBuff,1024,0); 319 320 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 321 sprintf_s(m_cSendBuff,RCPT TO:rn,m_sMailInfo.m_pcReceiver); 322 rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); 323 if(rt!=strlen(m_cSendBuff) 324 325 return false; 326 327 recv(sock,m_cReceiveBuff,1024,0); 328 329 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 330 memcpy(m_cSendBuff,DATArn,strlen(DATArn); 331 rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); 332 if(rt!=strlen(m_cSendBuff) 333 334 return false; 335 336 recv(sock,m_cReceiveBuff,1024,0); 337 338 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 339 sprintf_s(m_cSendBuff,From:%srn,m_sMailInfo.m_pcSenderName,m_sMailInfo.m_pcSender); 340 sprintf_s(&m_cSendBuffstrlen(m_cSendBuff),150,To:INVT.COM.CNrn,m_sMailInfo.m_pcReceiver); 341 sprintf_s(&m_cSendBuffstrlen(m_cSendBuff),150,Subject:%srnMime-Version: 1.0rnContent-Type: multipart/mixed; boundary=INVTrnrn,m_sMailInfo.m_pcTitle); 342 rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); 343 if(rt!=strlen(m_cSendBuff) 344 345 return false; 346 347 348 return true; 349 350 351 bool CSendMail:SendTextBody(SOCKET &sock) 352 353 int rt; 354 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 355 sprintf_s(m_cSendBuff,-INVTrnContent-Type: text/plain;rn charset=gb2312rnrn%srnrn,m_sMailInfo.m_pcBody); 356 rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); 357 if(rt!=strlen(m_cSendBuff) 358 359 return false; 360 361 else 362 363 return true; 364 365 366 367 bool CSendMail:SendFileBody(SOCKET &sock) 368 369 int i; 370 char* filePath; 371 int rt; 372 int len; 373 int pt=0; 374 char fileName128; 375 for(i=0;im_pcFilePathList.GetCount();i+) 376 377 pt=0; 378 memset(fileName,0,128); 379 filePath=m_pcFilePathList.GetAt(m_pcFilePathList.FindIndex(i); 380 len=GetFileData(filePath); 381 GetFileName(fileName,filePath); 382 383 sprintf_s(m_cSendBuff,-INVTrnContent-Type: application/octet-stream;rn name=%srnContent-Transfer-Encoding: base64rnContent-Disposition: attachment;rn filename=%srnrn,fileName,fileName); 384 send(sock,m_cSendBuff,strlen(m_cSendBuff),0); 385 while (ptlen) 386 387 memset(m_cSendBuff,0,sizeof(m_cSendBuff); 388 Char2Base64(m_cSendBuff,&m_pcFileBuffpt,min(len-pt,3000); 389 m_cSendBuffstrlen(m_cSendBuff)=r; 390 m_cSendBuffstrlen(m_cSendBuff)=n; 391 rt=send(sock,m_cSendBuff,strlen(m_cSendBuff),0); 392 pt+=min(len-pt,3000); 393 if(rt!=strlen(m_cSendBuff) 394 395 return false; 396 397 398 if(len!=0) 399 400 delete m_pcFileBuff; 401 402 403 404 return true; 405 406 407 bool CSendMail:SendEnd(SOCKET &sock) 408 409 sprintf_s(m_cSendBuff,-INVT-rn.rn); 410 send(sock,m_cSendBuff,strlen(m_cSendBuff),0); 411 412 sprintf_s(m_cSend
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内科医患沟通技巧
- 开颅钻颅术后引流管的护理
- 营销策略流程图
- 圆锥曲线精美课件
- 风险分散型草牧场托管养殖合同
- 市场营销策划与市场战略制定专员劳动合同
- 知识产权评估与财务顾问服务合作协议
- 跨国公司车辆收费员劳务派遣协议书
- 商业大厦立体停车库租赁合同
- 亲子插画故事书创作合同
- 湖南省娄底市涟源市2023-2024学年六年级下学期期末数学试题
- 应征公民政治考核表(含各种附表)
- 婚礼堂改造合同范本
- 2024年湖南省中考地理+生物试卷
- 【企业分拆上市问题探究文献综述5800字】
- 2024届安徽省合肥市一六八中学高一数学第二学期期末联考模拟试题含解析
- 孕产妇健康管理培训课件
- 高校师德师风专题培训课件
- 制造业中员工的仓库管理培训
- 砼回弹强度自动计算表
- 果汁饮料加工厂可行性研究方案
评论
0/150
提交评论