SMTP邮件服务器实验报告及源代码.docx_第1页
SMTP邮件服务器实验报告及源代码.docx_第2页
SMTP邮件服务器实验报告及源代码.docx_第3页
SMTP邮件服务器实验报告及源代码.docx_第4页
SMTP邮件服务器实验报告及源代码.docx_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

SMTP邮件服务器实验1. 实验内容和实验环境描述实验任务:使用Socket API编写一个SMTP邮件服务器程序实验内容:1)作为SMTP服务器,接收邮件客户端程序的TCP连接请求,接收SMTP命令和邮件数据,将邮件保存在文件中; 2)作为SMTP客户端,建立到实际邮件服务器的TCP连接,发送SMTP命令,将保存的邮件发送给实际邮件服务器; 3)提供邮件差错报告:将实际邮件服务器的差错报告转发给邮件客户端软件; 4)支持一封邮件多个接收者,要求接收者属于不同的域(如、163.com、,); 5)提供发件人和收件人Email地址格式检查功能,例如下列邮件地址是错误的:chengli,chengli,, . 。实验环境:Microsoft Visual Studio 20102. 软件设计(1) 数据结构:char mail_from4096;/存发件地址char rcpt_to54096;/存收件地址char data4096;/存Datachar imf4096;/存邮件标准格式WORD A;/加载套接字库WSADATA B;/储存调用WSAStartup函数返回的Windows Sockets初始化信息int err;/报错标志SOCKET sockSrv;/创建用于监听客户端的套接字SOCKADDR_IN addrSrv;/作为服务器端的socket地址char recvBuf4096=;/接收客户端SMTP指令(2) 模块结构:1main();/服务器端,用于从客户端接收储存邮件2main_clicenet(SOCKET s);/客户端,用于将收到的邮件转发到邮件服务器,同时将邮件服务器的错误报告通过SOCKET s转发给客户端3 ValidEmail(char *addr);/收发件地址(addr)合法性监测(3) 算法流程:画出流程图,描述算法的主要流程。Main()Load Windows Sockets;创建用于监听的socket;绑定socket和sockaddr;将socket设为监听模式;While(1)请求队列非空则抽取第一个链接建立连接;打开邮件储存文件;Send:220 recv:EHLO ; Send:250 OK recv:MAIL FROM: T 发 件 地址 合 法 FSend:550 Invalid User ; continueSend:250 OK recv: RCPT TO:;检查合法性While(recv!=DATA)recv: RCPT TO:;检查合法性Send:250 OKRecv:DATAsend:354 Start mail input;end with .rn recv: DATA fragment, .bytesSend:250 recv:IMF; send 250 recv: . Send:QUIT调用客户端程序关闭套接字关闭文件指针释放分配的套接字资源(4) 主要功能模块的实现要点1main();/服务器端,用于从客户端接收储存邮件实现要点:与客户端建立连接,根据SMTP协议标准进行通信。2main_clicenet(SOCKET s);/客户端,用于将收到的邮件转发到邮件服务器,同时将邮件服务器的错误报告通过SOCKET s转发给客户端实现要点:与服务器端建立连接,根据SMTP协议标准进行通信。3 ValidEmail(char *addr);/收发件地址(addr)合法性监测实现要点:根据标准email地址格式进行合法性监测3 实验结果演示及分析(1) 对于你所实现的功能,逐个进行测试,并将输出截图。普通邮件群发: 1 2 34错误报告:12(2) 你的程序是否提供了差错处理功能?可以对哪些差错进行处理?1 将实际邮件服务器的差错报告转发给邮件客户端软件;2监测收发件邮箱地址格式是否正确(3) 和课堂上学习的SMTP协议相比,你的程序是否完全按照协议来实现,是否有不同之处?和实际的SMTP服务器相比,你的程序有哪些优点和不足?不是。因为main函数无法从客户端收取用户名和密码,故跳过AUTH LOGIN部分,直接开始MAILFROM:。优点:代码功能较为简洁易懂。不足:未实现用户合法性监测。以及收发件邮箱地址是否实际存在。4 实验总结和心得体会描述你在调试过程中都遇到了哪些问题和解决的过程。(1) 完成本次实验的实际上机调试时间是多少? 14hours。(2) 编程工具方面遇到了哪些问题?包括Windows环境和VC软件的安装问题。没。(3) 编程语言方面遇到了哪些问题?包括C语言使用和对C语言操控能力上的问题。涉及到Socket方面的函数由于初次接触使用尚不熟练。(4) 协议方面遇到了哪些问题?包括协议机制的设计错误,发现协议死锁,或者不能正确工作,协议参数的调整等问题。协议中提供的邮件域名解析指令被大部分邮件服务器屏蔽,只能通过其他函数编码实现相应功能。(5) 通过本次试验,你认为SMTP协议有哪些不足?有何改进思路?功能较为基础,但扩展改进等已有SSL,X2.5等增强版本存在。(6) 总结本次实验,你在C 语言方面,协议软件方面,理论学习方面,软件工程方面等哪些方面上有所提高?熟悉了C语言的编码规范,通信协议的工作机制。5 源程序清单#pragma comment(lib,wsock32.lib) #include#include#include#includechar mail_from4096;char rcpt_to54096;char data4096;char imf4096;void main_Client(SOCKET);int ValidEmail(char*);void main()WORD A = MAKEWORD(1,1); /加载套接字库WSADATA B; /储存调用WSAStartup函数返回的Windows Sockets初始化信息int err;err=WSAStartup(A,&B); /根据A要求的版本初始化Winsock服务if(err!=0) / Tell the user that we couldnt find a useable / winsock.dll. return;if (LOBYTE(B.wVersion)!=1|HIBYTE(B.wVersion)!=1) WSACleanup( ); /检查socket版本,不符合则释放分配资源return;SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); /创建用于监听客户端的套接字SOCKADDR_IN addrSrv;/作为服务器端的socket地址addrSrv.sin_addr.S_un.S_addr=inet_addr();/ Internet address addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(25); /服务器端端口号bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); /绑定套接字listen(sockSrv,5); /将套接字设为监听模式,准备接受客户请求SOCKADDR_IN addrClient; /客户端地址int len=sizeof(SOCKADDR);char *sendBuf=220 LXs SMTP Readyrn,250 LXs server|250 mail|250 PIPELININGrn,250 OKrn,250 OKrn,354 Start mail input;end with .rn,250 OKrn,250 OKrn,QUITrn,550 Invalid Userrn; /发送标示符char tempbuf14096=;while(1) /等待客户请求SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); /队列非空则sockSrv抽取第一个链接,否则阻塞调用进程FILE *fp;fp=fopen(d:Universitymail.txt,w+); char recvBuf4096=; /接收客户端SMTP指令memset(rcpt_to,0,sizeof(rcpt_to);send(sockConn,sendBuf0,strlen(sendBuf0),0); /向已经连接的套接字sockConn发送连接建立信息:220recv(sockConn,recvBuf,sizeof(recvBuf),0); /接收数据 EHLO acer-PCfprintf(fp,%sn,recvBuf); /将数据写入文件memset(recvBuf,0,sizeof(recvBuf); /将recvBuf前4096个字节用字符0替换send(sockConn,sendBuf1,strlen(sendBuf1),0); / send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:MAIL FROM:if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue; /send:550memcpy(mail_from,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: RCPT TO:if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue; /send:550 memcpy(rcpt_to0,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0);/recv:?int i=1;strncpy(tempbuf1,recvBuf,4);while(strcmp(tempbuf1,RCPT)=0)&(i5)if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue;/send:550 memcpy(rcpt_toi,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: RCPT TO:strncpy(tempbuf1,recvBuf,4);+i;fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf4,strlen(sendBuf4),0);/send:354 Start mail input;end with .rnrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:DATA fragment, .bytesmemcpy(data,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf5,strlen(sendBuf5),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:IMFmemcpy(imf,recvBuf,sizeof(recvBuf);fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf6,strlen(sendBuf6),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: . fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf7,strlen(sendBuf7),0); /send:QUITfprintf(fp,%sn,recvBuf);main_Client(sockConn); /调用客户端函数closesocket(sockConn); /关闭套接字fclose(fp); /关闭文件指针WSACleanup(); /释放分配资源void main_Client(SOCKET sockCo)WORD A=MAKEWORD(1,1); WSADATA B; int err; err=WSAStartup(A,&B); if(err!=0)return; if(LOBYTE(B.wVersion)!=1|HIBYTE(B.wVersion)!=1)WSACleanup();return;SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrClient; addrClient.sin_family = AF_INET; addrClient.sin_port = htons(25); struct hostent *host; /主机信息host = gethostbyname(); memcpy(&addrClient.sin_addr.S_un.S_addr,host-h_addr_list0,host-h_length); /将获取的主机IP地址复制到客户端网络地址.32位无符号IPV4地址 connect(sockClient,(SOCKADDR*)&addrClient,sizeof(SOCKADDR); /连接套接字 char *SendBuf = EHLO rn, AUTH LOGINrn, Z3VhaWRhbzIyrn,/邮箱名的Base64编码THVuYVhUSjkyMTAxNA=rn,/密码的Base64编码DATArn, rn.rn,QUIT; char arecvBuf4096 = ; char tempbuf3=;memset(tempbuf,0,sizeof(tempbuf); memset(arecvBuf, 0, sizeof(arecvBuf); /初始化arecvBufrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:220 OKmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf0, strlen(SendBuf0), 0); /send:EHLO acer_PCrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf1, strlen(SendBuf1), 0); /send:AUTH LOGINrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:334strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,334)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf2, strlen(SendBuf2), 0); /send:Z3VhaWRhbzIyrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:334strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,334)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf3, strlen(SendBuf3), 0); /send:THVuYVhUSjkyMTAxNA=recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /rec:235strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,235)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, mail_from, strlen(mail_from), 0); /send:MAIL FROM:recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);int i=0;while(rcpt_toi0!=0)&(i5)memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, rcpt_toi, strlen(rcpt_toi), 0); /send:RCPT TO:recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);+i;memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf4, strlen(SendBuf4), 0); /send: DATArecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:354strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,354)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, data, strlen(data), 0); /send:DATA fragment, .bytesmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, imf, strlen(imf), 0); /send:imf fragmentmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf5, strlen(SendBuf5), 0); /send: . recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0

温馨提示

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

评论

0/150

提交评论