《SMTP邮件服务器实验报告及源代码.docx》由会员分享,可在线阅读,更多相关《SMTP邮件服务器实验报告及源代码.docx(15页珍藏版)》请在金锄头文库上搜索。
1、SMTP邮件服务器实验1. 实验内容和实验环境描述实验任务:使用Socket API编写一个SMTP邮件服务器程序实验内容:1)作为SMTP服务器,接收邮件客户端程序的TCP连接请求,接收SMTP命令和邮件数据,将邮件保存在文件中; 2)作为SMTP客户端,建立到实际邮件服务器的TCP连接,发送SMTP命令,将保存的邮件发送给实际邮件服务器; 3)提供邮件差错报告:将实际邮件服务器的差错报告转发给邮件客户端软件; 4)支持一封邮件多个接收者,要求接收者属于不同的域(如、、,); 5)提供发件人和收件人Email地址格式检查功能,例如下列邮件地址是错误的:chengli,chengli,, .
2、。实验环境: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=;
3、/接收客户端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)请求队列非空则抽取第一个链接建立连接;打开邮件储存文件;S
4、end: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调用客户端程
5、序关闭套接字关闭文件指针释放分配的套接字资源(4) 主要功能模块的实现要点1main();/服务器端,用于从客户端接收储存邮件实现要点:与客户端建立连接,根据SMTP协议标准进行通信。2main_clicenet(SOCKET s);/客户端,用于将收到的邮件转发到邮件服务器,同时将邮件服务器的错误报告通过SOCKET s转发给客户端实现要点:与服务器端建立连接,根据SMTP协议标准进行通信。3 ValidEmail(char *addr);/收发件地址(addr)合法性监测实现要点:根据标准email地址格式进行合法性监测3 实验结果演示及分析(1) 对于你所实现的功能,逐个进行测试,并将输
6、出截图。普通邮件群发: 1 2 34错误报告:12(2) 你的程序是否提供了差错处理功能?可以对哪些差错进行处理?1 将实际邮件服务器的差错报告转发给邮件客户端软件;2监测收发件邮箱地址格式是否正确(3) 和课堂上学习的SMTP协议相比,你的程序是否完全按照协议来实现,是否有不同之处?和实际的SMTP服务器相比,你的程序有哪些优点和不足?不是。因为main函数无法从客户端收取用户名和密码,故跳过AUTH LOGIN部分,直接开始MAILFROM:。优点:代码功能较为简洁易懂。不足:未实现用户合法性监测。以及收发件邮箱地址是否实际存在。4 实验总结和心得体会描述你在调试过程中都遇到了哪些问题和解
7、决的过程。(1) 完成本次实验的实际上机调试时间是多少? 14hours。(2) 编程工具方面遇到了哪些问题?包括Windows环境和VC软件的安装问题。没。(3) 编程语言方面遇到了哪些问题?包括C语言使用和对C语言操控能力上的问题。涉及到Socket方面的函数由于初次接触使用尚不熟练。(4) 协议方面遇到了哪些问题?包括协议机制的设计错误,发现协议死锁,或者不能正确工作,协议参数的调整等问题。协议中提供的邮件域名解析指令被大部分邮件服务器屏蔽,只能通过其他函数编码实现相应功能。(5) 通过本次试验,你认为SMTP协议有哪些不足?有何改进思路?功能较为基础,但扩展改进等已有SSL,X2.5等
8、增强版本存在。(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); /加
9、载套接字库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=socke
10、t(AF_INET,SOCK_STREAM,0); /创建用于监听客户端的套接字SOCKADDR_IN addrSrv;/作为服务器端的socket地址addrSrv.sin_addr.S_un.S_addr=inet_addr(127.0.0.1);/ Internet address addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(25); /服务器端端口号bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); /绑定套接字listen(sockSrv,5); /将套接字设为监听模式,准备接受
11、客户请求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(sock
12、Srv,(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 ac
13、er-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