计算机网络实验SMTP邮件发送系统socket编程_第1页
计算机网络实验SMTP邮件发送系统socket编程_第2页
计算机网络实验SMTP邮件发送系统socket编程_第3页
计算机网络实验SMTP邮件发送系统socket编程_第4页
计算机网络实验SMTP邮件发送系统socket编程_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验邮件客户端实现1316-30-何珊珊[实验名称]:邮件客户端实现[实验器材]:右与因特网连接的计算机网络系统;右主机操作系统为Windows7;右VC6[实验内容]::要求学生利用已有的套接字常识使用SMTP和POP3的任一种协议,实现对于特定邮件服务器(mail.163)的发送邮件功能。[实验步骤]:在VC6中搭建工程,因为SMTP中用户名和密码都要经过64位编码的处理,所以工程中除了对SMTP的编程外还需要一个64为编码的转换函数。以下是代码:MailTest.cpp:#include"stdafx.h"#include"SMTP.h"intmain(intargc,char*argv[]){charto[256];chartitle[256];charbody[1024];charstrServer[128];charstrUser[128];charstrPsw[128];charstrSndMail[128];CSMTPsmtp;smtp.Initialize();/*charto[]="heshanshan2512@";chartitle[]="test";charbody[]="heshanshan09211595";charstrServer[]="SMTP.163.com";charstrUser[]="shan_shan2512";charstrPsw[]="shanshan091756";charstrSndMail[]="shan_shan2512@163.com";*/ //提示输入的信息printf("strServer:");scanf("%s",strServer);printf("strSndMail:");scanf("%s",strSndMail);printf("strUser:");scanf("%s",strUser);printf("strPsw:");scanf("%s",strPsw);printf("to:");scanf("%s",to);printf("title:");scanf("%s",title);printf("body:");scanf("%s",body);if(smtp.MailSend(to,title,body,strServer,strUser,strPsw,strSndMail)){printf("successful\n");//发送成功}else{printf("fail\n");//发送失败}return0;}SMTP.h:#pragmaonce#include<string>#include"Base64.h"#include<Winsock2.h>#pragmacomment(lib,"Ws2_32")#include<windows.h>#include<time.h>usingnamespacestd;classCSMTP{public:CSMTP(void);~CSMTP(void);BOOLInitialize(void);BOOLMailSend(stringto,stringtitle,stringbody,stringstrServer,stringstrUser,stringstrPsw,stringstrSndMail);private:SOCKETm_socket;};SMTP.cpp:

#include"stdafx.h"#include"SMTP.h"#defineMAX_PACKET_SIZE1024CSMTP::CSMTP(void)//构造函数{m_socket=NULL;}CSMTP::~CSMTP()//析构函数BOOLCSMTP::Initialize() //入口函数{WORDwVersionRequested; //用WSAStartup函数加载套接字库,并进行版本协商WSADATAwsaData;interr;wVersionRequested=MAKEWORD(1,1);err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){returnFALSE;}if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)WSACleanup();returnFALSE;}returnTRUE;}BOOLCSMTP::MailSend(stringto,stringtitle,stringbody,stringstrServer,stringstrUser,stringstrPsw,stringstrSndMail){sockaddr_inaddrSmtp; //配置服务端地址信息constchar*smtpServer=strServer.c_str();constchar*smtpUser=strUser.c_str();constchar*smtpPass=strPsw.c_str();constchar*senderMail=strSndMail.c_str();if(m_socket!二NULL) 〃判断socket是否可用,若不可用重新创建{closesocket(m_socket);m_socket=NULL;if(m_socket==NULL){m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建一个客户端的套接字}structin_addrin;hostent*hosts=gethostbyname(smtpServer);//域名转换if(hosts!=NULL){memcpy((char**)&(in),hosts->h_addr,hosts->h_length)//把主机地址付给in}else{returnFALSE;}stringaddrc=inet_ntoa(in);//将网络字节序转换成应用的格式addrSmtp.sin_family=AF_INET;//配置服务端地址信息addrSmtp.sin_addr.s_addr=in.S_un.S_addr;addrSmtp.sin_port=htons(25);//SMTP的端口号为25intret=0;ret=connect(m_socket,(LPSOCKADDR)&addrSmtp,sizeof(addrSmtp));//与服务端进行连接if(ret==SOCKET_ERROR)//连接失败{char*err=newchar[1024];sprintf(err,"连接失败%d",GetLastError());printf("%s\n",err);returnFALSE;}chars[MAX_PACKET_SIZE];charr[MAX_PACKET_SIZE];memset((void*)s,0,MAX_PACKET_SIZE);memset((void*)r,0,MAX_PACKET_SIZE);intlen;stringresponse;//等待服务器回应len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len)response=r;intposition=response.substr(0,3).compare("220");//判断返回信息的前三个字符是否为220,如果是,表示连接服务器成功if(position==0){len=sprintf((char*)s,"helo%s\r\n",strUser.c_str());//将用户名赋给s并发送给服务器len=send(m_socket,s,strlen(s),0);}else{printf(r);if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;•BSlVdUjnie」【linN二妙pos—iu:ft9>|DOS_lU)19>|DOS9SOpfte>|DOS_iu)4!^(J)puud}9S|9{:(0,(S)U9|JlS,S,19>|DOS_lU)pU9S=U9|器參缆修S尊◎胆胡到层豆坯〃•(..u\J\NID01HinV..,sGjeqD))puuds=u9|}(0二二uoq!sod)j!丄沓罰回聊竺峯'者剖輕0立空者瞬&三W&0WW回虫期條〃【(“os乙)aediuo丁(£'o)Hsqns~suodsa二uo^sodiu!:j=9suodse」}(U引)j!WW&0回虫器參缆勒尋//l(03ZIS\Lm>DVcrxVIAr」(¥」eLp)M>pos—w)2a=u引•BSlVdUjniejelse{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//等待登录回应len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);//接收服务器返回的信息if(len){response=r;intposition=response.substr(0,3).compare("334");//判断返回信息的前三个字符是否为334,如果是,表示此时可以输入64位编码过的用户名了if(position==0){unsignedchar*dst=(unsignedchar*)smtpUser;stringstrTmp=Base64::base64_encode(dst,len);//进行64位编码len=sprintf((char*)s,"%s\r\n",(constchar*)strTmp.c_str());len=send(m_socket,s,strlen(s),0);//发送编码过的用户名}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//发送完用户名后等待回应len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);//发送编码过的密码,代码和发送用户名时的方式类似if(len){response=r;intposition=response.substr(0,3).compare("334");if(position==0){unsignedchar*dst=(unsignedchar*)smtpPass;len=strlen((char*)dst);stringstrTmp=Base64::base64_encode(dst,len);len=sprintf((char*)s,"%s\r\n",(constchar*)strTmp.c_str());len=send(m_socket,s,strlen(s),0);}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//发送完密码后等待回应看是否登录成功len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("235");if(position==0){len=sprintf((char*)s,"MAILFROM:<%s>\r\n",senderMail);len=send(m_socket,s,strlen(s),0);//发送本地邮箱的地址}elseclosesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//header部份len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("250");if(position==0)len=sprintf((char*)s,"RCPTTO:<%s>\r\n",to.c_str());//发送要发送的邮箱的地址len=send(m_socket,s,strlen(s),0);}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;//header部份len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("250");if(position==0){len二sprintf((char*)s,"DATA\r\n");〃发送data向服务器发送邮件内容的申请len=send(m_socket,s,strlen(s),0);}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}elseif(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("354");if(position==0){chardate_string[MAX_PACKET_SIZE];time_tseconds;//调用本地时间time(&seconds);strftime(date_string,MAX_PACKET_SIZE,"%a,%d%b%y%H:%M:%S+0800",localtime(&seconds));sprintf((char*)s,"From:%s\r\nTo:%s\r\nDate:%s\r\nSubject:%s\r\n\r\nX-Mailer:%s\r\nX-Priority:%s\r\nMIME-Version:1.0\r\nContent-type:multipart/mixed;boundary=\"%s\"\r\n\r\n",senderMail,to.c_str(),date_string,title.c_str(),"SMailer","3","#BOUNDARY#");len=send(m_socket,s,strlen(s),0);}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//邮件正文sprintf((char*)s,"--%s\r\nContent-Type:%s\r\nContent-Disposition:%s\r\nContent-Transfer-Encoding:%s\r\n\r\n%s\r\n\r\n","#BOUNDARY#","text/plain;charset=gb2312","","8bit",body.c_str());len=send(m_socket,s,strlen(s),0);//邮件结束sprintf((char*)s,"\r\n--%s--\r\n.\r\n","#BOUNDARY#");len=send(m_socket,s,strlen(s),0);len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("250");if(position==0){//退出连接sprintf((char*)s,"QUIT\r\n");len=send(m_socket,s,strlen(s),0);}elseif(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//断开连接len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("221");if(position==0){if(m_socket)closesocket(m_socket);m_socket=NULL;}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;returnTRUE;}Base64.cpp:#include"StdAfx.h"#include"Base64.h"staticconststd::stringbase64_chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz""0123456789+/";std::stringBase64::base64_encode(unsignedcharconst*bytes_to_encode,unsignedintin_len){std::stringret;inti=0;intj=0;unsignedcharchar_array_3[3];while(in_len--){char_array_3[i++]=*(bytes_to_encode++);if(i==3){char_array_4[0]=(char_array_3[0]&0xfc)>>2;char_array_4[1]=((char_array_3[0]&0x03)<<4)+((char_array_3[1]&0xf0)>>4);char_array_4[2]=((char_array_3[1]&0x0f)<<2)+((char_array_3[2]&0xc0)>>6);char_array_4[3]=char_array_3[2]&0x3f;for(i=0;(i<4);i++)ret+=base64_chars[char_array_4[i]];i=0;}}if(i){for(j=i;j<3;j++)char_array_4[0]=(char_array_3[0]&0xfc)>>2;char_array_4[1]=((char_array_3[0]&0x03)<<4)+((char_array_3[1]&0xf0)>>4);char_array_4[2]=((char_array_3[1]&0x0f)<<2)+((char_array_3[2]&0xc0)>>6);char_array_4[3]=char_array_3[2]&0x3f;for(j=0;(j<i+1);j++)ret+=base64_chars[char_array_4[j]];while((i++<3))ret+='=';}returnret;}std::stringBase64::base64_decode(std::stringconst&encoded_string){intin_len=encoded_string.size();inti=0;intj=0;intin_=0;unsignedcharchar_array_4[4],char_array_3[3];std::stringret;while (in_len-- &&(encoded_string[in_]!='=')&&is_base64(encoded_string[in_])){char_array_4[i++]=encoded_string[in_];in_++;if(i==4){for(i=0;i<4;i++)char_array_4[i]=base64_chars.find(char_array_4[i]);char_array_3[0]=(char_array_4[0]<<2)+((char_array_4[1]&0x30)>>4)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论