好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

SMTP邮件服务器实验报告及源代码.docx

15页
  • 卖家[上传人]:ni****g
  • 文档编号:547426219
  • 上传时间:2023-11-07
  • 文档格式:DOCX
  • 文档大小:599.87KB
  • / 15 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • SMTP邮件服务器实验1. 实验内容和实验环境描述 实验任务:使用Socket API编写一个SMTP邮件服务器程序 实验内容:1)作为SMTP服务器,接收邮件客户端程序的TCP连接请求,接收SMTP命令和邮件数据,将邮件保存在文件中; 2)作为SMTP客户端,建立到实际邮件服务器的TCP连接,发送SMTP命令,将保存的邮件发送给实际邮件服务器; 3)提供邮件差错报告:将实际邮件服务器的差错报告转发给邮件客户端软件; 4)支持一封邮件多个接收者,要求接收者属于不同的域(如、、,…); 5)提供发件人和收件人Email地址格式检查功能,例如下列邮件地址是错误的:chengli,chengli@,, …. 实验环境:Microsoft Visual Studio 20102. 软件设计 (1) 数据结构: char mail_from[4096]; //存发件地址 char rcpt_to[5][4096]; //存收件地址 char data[4096]; //存Data char imf[4096]; //存邮件标准格式 WORD A; //加载套接字库 WSADATA B; //储存调用WSAStartup函数返回的Windows Sockets初始化信息 int err; //报错标志 SOCKET sockSrv; //创建用于监听客户端的套接字 SOCKADDR_IN addrSrv; //作为服务器端的socket地址 char recvBuf[4096]=""; //接收客户端SMTP指令 (2) 模块结构: [1]main(); //服务器端,用于从客户端接收储存邮件 [2]main_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 .\r\n recv: DATA fragment, ...bytesSend:250 recv:IMF; send 250 recv: . Send:QUIT调用客户端程序关闭套接字关闭文件指针释放分配的套接字资源 (4) 主要功能模块的实现要点 [1]main(); //服务器端,用于从客户端接收储存邮件 实现要点:与客户端建立连接,根据SMTP协议标准进行通信。

      [2]main_clicenet(SOCKET s); //客户端,用于将收到的邮件转发到邮件服务器,同时将邮件服务器的错误报告通过SOCKET s转发给客户端 实现要点:与服务器端建立连接,根据SMTP协议标准进行通信 [3] ValidEmail(char *addr); //收发件地址(addr)合法性监测 实现要点:根据标准email地址格式进行合法性监测3 实验结果演示及分析 (1) 对于你所实现的功能,逐个进行测试,并将输出截图 普通邮件群发: 1> 2> 3>4> 错误报告: 1> 2> (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_from[4096];char rcpt_to[5][4096];char data[4096];char imf[4096];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 couldn't 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("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); //将套接字设为监听模式,准备接受客户请求 SOCKADDR_IN addrClient; //客户端地址 int len=sizeof(SOCKADDR); char *sendBuf[]={ "220 LX's SMTP Ready\r\n", "250 LX's server|250 mail|250 PIPELINING\r\n", "250 OK\r\n", "250 OK\r\n", "354 Start mail input;end with .\r\n", "250 OK\r\n", "250 OK\r\n", "QUIT\r\n", "550 Invalid User\r\n"}; //发送标示符 char tempbuf1[4096]=""; while(1) //等待客户请求 { SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //队列非空则sockSrv抽取第一个链接,否则阻塞调用进程 FILE *fp; fp=fopen("d:\\University\\mail.txt","w+"); char recvBuf[4096]=""; //接收客户端SMTP指令 memset(rcpt_to,0,sizeof(rcpt_to)); send(sockConn,sendBuf[0],strlen(sendBuf[0]),0); //向已经连接的套接字sockConn发送连接建立信息:220 recv(sockConn,recvBuf,sizeof(recvBuf),0); //接收数据 EHLO acer-PC fprintf(fp,"%s\n",recvBuf); //将数据写入文件 memset(recvBuf,0,sizeof(recvBuf)); //将recvBuf前4096个字节用字符'0'替换 send(sockConn,sendBuf[1],strlen(sendBuf[1]),0); // send:250 OK recv(sockConn,recvBuf,sizeof(recvBuf),0); //recv:MAIL FROM:<...> if(ValidEmail(recvBuf)){send(sockConn,sendBuf[8],strlen(sendBuf[8]),0); closesocket(sockConn); fclose(fp。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.