您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 电子设计/PCB > SMTP、POP3协议及实现
SMTP项目概要设计简单邮件传输协议SMTP简单邮件传输协议(SimpleMailTransferProtocol,SMTP)是事实上的在Internet传输email的标准。SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。1.SMTP的最大特点:简单、直观只规定发送程序和接收程序之间的命令和应答命令和响应都是可读的ASCII字符串2.SMTP邮件传输采用客户—服务器模式3.SMTP服务器在TCP的25端口守候4.SMTP协议是一个严格的锁步协议常用的SMTP命令常用的SMTP响应SMTP响应以3位数字开始,后面跟有该响应的具体描述SMTP邮件传递过程连接建立阶段邮件传递阶段连接关闭阶段SMTP邮件传递过程1、与SMTP服务器建立TCP连接.......................服务器地址通常为smtp.**.com/net端口25(记住所有命令以一个CRLF结束)2、与服务器握手..................................HELO+服务器地址名称+CRLF3、AUTHLOGIN....................................请求登录4、用户名........................................base64编码的用户名5、密码..........................................base64编码的密码6、MAILFROM:.................................输入帐户的正确的邮件地址,这里于这帐户信息不一致会导致服务器拒绝7、RCPTTO:....................................接收者,多个接收者多次调用该命令8、DATA..........................................即将输入邮件正文依次输入TO:;FROM:;SUBJECT:;空一行正文;隔行以.结束9、QUIT..........................................退出连接状态SMTP邮件具体传送过程用telnet连接SMTP服务器最直观的方式是用telnet连接到SMTP的服务器,看如何利用命令操作SMTP。打开终端:(C:client,S:Server)C:telnetsmtp.163.com25(连接到163的SMTP服务器,协议规定SMTP服务器的端口号为25)S:Trying202.108.5.83...Connectedtosmtp.163.split.netease.com.Escapecharacteris'^]'.220163.comAnti-spamGTforCoremailSystem(163com[071018])(220表示连接成功C:HELOsmtp.163.com(协议规定的握手过程,格式为HELO+服务器名称)S:250OK(250表示握手成功)C:AUTHLOGIN(AUTHLOGIN是用户登录命令)S:334dXNlcm5hbWU6(334表示服务器接受)C:dG9tb*****FpbA==(base64编码后的用户名)S:334UGFzc3dvcmQ6(334表示接受)C:********aXZldXA=(base64编码后的密码)SMTP邮件具体传送过程S:235Authenticationsuccessful(235登录成功)C:MAILFROM:tommy_mail@163.com(MAILFROM:格式,这里要求必须是完全正确的发送者邮箱S:250MailOK(250系统常用确认信息)C:RCPTTO:zengbenyuan@126.com接收者邮箱S:250MailOKC:DATA(DATA明令表示以下为邮件正文)S:354EnddatawithCRLF.CRLFC:TO:11@11接收方地址FROM:22@22发送者地址SUBJECT:TESTMAILSMTP(邮件主题)helloworld(空一行写邮件正文).(正文以.结束)S:250MailOKqueuedassmtp3,DdGowLBLAjqD6_JIg1hfBA==.63235S21223879684(服务器接受)C:noop(空操作,延迟退出时间)S:250OKC:quit(退出SMTP服务器连接)1、使用Base64编码原因:E-mail只能支持7位数据,故不能传输8位二进制数据2、Base64编码方案:使用6位来代替二进制字节。即:三个8位字节变成四个6位字节,“=”表示结尾如:AAEC=//6位二进制编码的字符0x000x000x040x02//6位16进制表示的数值000000000000000100000010//6位二进制表示000000000000000100000010//转成3个8位二进制表示即:000102//十进制值附件编解码—Base64编码SMTP协议实现示例1、系统中实现的是一个简化的SMTPServer。仅仅是根据基本的SMTP交互协议实现邮件接收和邮件转储。不提供邮件转发,也不需要考虑多用户的邮件并发连接。该SMTPServer仅仅为单用户提供专用连接,并按自己的特定格式接收2、因此,该SMTPServer实现的核心是实现最简单的SMTP锁步协议对话机,并从邮件中析取出附件。在分析标准SMTP协议后,程序中仅实现符合应用需求的最简洁的SMTP对话机制。Server只是有效的发出每一个对话的响应码及固定信息,然后接收客户机的应答。在应答消息中也仅仅分析应答的字符命令是否正确,而不理睬其他信息。在邮件处理过程中,只查找主题并判断,然后从邮件中判断出附件的标志并从附件开始处接收然后解码。SMTP套接字服务器—main()SMTP套接字服务器—main()intmain(intargc.Char*argv[]){intlistenfd,connfd;socklen_tclilen;structsockaddr_incliaddr,servaddr;listenfd=socket(AF_INET,SOCK_STREAM,0);bzero((void*)&servaddr,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl(INADDR_ANY);servaddr.sin_port=htons(25);bind(1istenfd,(structsockaddr*)&servaddr,sizeof(servaddr));listen(1istenfd,5);SMTP套接字服务器—main()for(;;){clilen=sizeof(cliaddr);connfd=accept(1istenfd,(structsockaddr*)&cliaddr,&clilen);if(connfd=0){break;}handleConnection(connfd);close(connfd);}close(1istenfd);}服务器邮件结构#defineMAX_MAIL(1024*1024)#defineMAX_ATTACHMENT(900*1024)typedefstruct{unsignedcharsender[80];发送者unsignedcharrecipient[80];接受者unsignedcharsubject[80];主题字unsignedcharfilename[80];附件文件名unsignedcharrawMail[MAX_MAIL];原始邮件unsignedcharattachment[MAX_ATTACHMENT];intattachlen;)Mail;rawMail字符数组包括了通过连接接收到的原始邮件数据。Attachment的大小一般应该小于rawMail(因为解码过程会把Base64编码文本的4个字节转变成3个)。大小超过限制,简单的返回错误,忽略该邮件。SMTP协议处理—handleConnection()handleConnection实现了SMTP锁步协议。在客户机连接进来的时候,服务器发送致意220,并等待客户的致意响应HELO。然后,服务器处理下一步协议元素MAILFROM、RCPTTO并给出相应回复。接收到客户机的DATA命令后会准备接收E-mail报体。报体的接收一直持续到空行和“.”的出现。在接收过程中要分析每一个进来的字符。然后等待客户的QUIT命令,结束SMTP连接constchar*salutation={“220EmbededHomeMailUpdate\n”};constchar*conclose={“221closingconnection\n”};constchar*goahead={“250OK\n”};constchar*gimme={“354Gimme!\n”};constchar*closeit={“Serviceclosingtransmissionchannel.\n”};voidhandleConnection(intfd){intbufIdx=0;intstate=0,len,i,stop=0;charbuffer[81];SMTP协议处理—handleConnection()memset((void*)&mail,0,sizeof(mail));len=write(fd,salutation,strlen(salutation));if(len=0){return;}len=read(fd.buffer,255);buffer[1en]=0;if((strncmp(buffer,”HELO”,4))&&(strncmp(buffer,”EHLO”,4))){closeConnection(fd);return;}SMTP协议处理—handleConnection()write(fd,goahead,strlen(goahead));len=read{fd,buffer,255};buffer[1en]=0;if(Strncmp(buffer,“MAILFROM”,9)){closeConnection(fd);return;}grabAddress(buffer,mail.sender,256);if(mail.sender[0]==0]{closeConnection(fd);return;)write(fd,goahead,strlen(goahead));len=read(fd,buffer,255);buffer[1en]=0;if(Strncmp(buffer,“RCPTTO”,7)){closeConnection(fd);return;}grabAddress(buffer,mail.recipient,256);if(mail.recipient[0]==0){closeConnection(fd);return;}write(fd,goahead,strlen(goahead));SMTP协议处理—handleConnection()len=read(fd,buffer,255);buffer[1en]=0;if(strncmp(buffer,”DATA”,4)){closeconnection(fd);return;}write(fd,gimme,strlen(gimme));/*Looptoco11ectalloftheemailbody*/bufIdx=state=stop=0;while(!stop){if(bufIdxMAX_MAIL-80){closeConnection(fd);return;}1er=read(fd,&mail.rawMail[bufIdx],(M
本文标题:SMTP、POP3协议及实现
链接地址:https://www.777doc.com/doc-3295448 .html