基于C++实现的简单的SMTP服务器

张开发
2026/4/16 12:39:19 15 分钟阅读

分享文章

基于C++实现的简单的SMTP服务器
♻️ 资源大小1.99MB➡️资源下载https://download.csdn.net/download/s1t16/87425399一、实验目的及任务1、通过对WireShark抓包实例进行分析进一步加深对SMTP网络协议的理解。2、编写一个简单的SMTP服务器实现作业2中abcde项所要求的功能。二、实验环境1、系统环境Windows 10 家庭中文版 16072、邮件客户端3、WireSharkVersion 2.2.14、IDEVisual Studio 2015 Update 35、调试环境MFC Release x866、编程语言C三、实验原理1、利用Wireshark软件抓取本地PC的数据包观察其主要使用的网络协议。2、根据所获数据包的内容分析相关协议从而加深对SMTP网络协议的理解。3、利用Winsock实现本地SMTP服务器并实现与邮件客户端如outlook的交互。4、SMTP工作原理1客户端使用TCP协议连接SMTP服务器的25端口2客户端发送HELO报文将自己的域地址告诉给SMTP服务器3SMTP服务器接受连接请求向客户端发送请求账号密码的报文AUTH LOGIN4客户端向SMTP服务器传送账号和密码如果验证成功向客户端发送一个OK命令表示可以开始报文传输5客户端使用MAIL命令将邮件发送者的名称发送给SMTP服务器6SMTP服务器发送OK命令做出响应7客户端使用RCPT命令发送邮件接收者地址如果SMTP服务器能识别这个地址就向客户端发送OK命令否则拒绝这个请求8收到SMTP服务器的OK命令后客户端使用DATA命令发送邮件的数据。9客户端发送QUIT命令终止连接。四、实验步骤1.SMTP协议抓包分析开始我使用foxmail邮箱登陆结果总也抓不到数据包并不知道是何原因之后在foxmail客户端登陆了南开邮箱抓包成功。配置如下打开Wireshark开始捕获然后使用foxmail客户端发送一封邮件停止捕获查看Wireshark中的数据。因为SMTP协议是基于TCP的所以先进行三次握手客户端与服务器建立TCP连接服务器返回连接信息表示是否连接成功S: 220 smtp-2.qy.internal ESMTP ready服务器发送220表示已经准备就绪。客户端向服务器发送命令HELO并加上本机的主机名DESKTOP-HJVDMSM服务器响应并回复250表示服务器可用。客户端向服务器发送用户登录命令AUTH LOGIN服务器回复的两个334分别表示用户名和密码之后客户端分别向服务器发送编码后的用户名和密码SMTP要求用户名和密码都通过64位编码后再发送不接受明文服务器分别回复235表示身份验证成功。客户端分别先后向服务器发送MAIL FROM和RCPT TO命令后面分别加上发件人的邮箱地址和收件人的邮箱地址服务器分别回应250表示成功接受。接下来客户端向服务器发送命令DATA表示将要向服务器发送邮件正文服务器回应354 End data with .表示开始邮件输入以.结束。然后客户端将邮件内容发送给服务器大小为378 bytes服务器回应250表示接收成功。邮件已成功发送到服务器客户端向服务器发送命令QUIT释放服务器连接服务器返回221表示同意。双方断开连接通信过程结束。2.SMTP服务器的实现1程序流程图2程序响应命令表3命令可能的服务器返回值500 格式错误命令不可识别此错误也包括命令行过长501 参数格式错误502 命令不可实现503 错误的命令序列504 命令参数不可实现211 系统状态或系统帮助响应214 帮助信息220 服务就绪221 服务关闭传输信道421 服务未就绪关闭传输信道当必须关闭时此应答可以作为对任何命令的响应250 要求的邮件操作完成251 用户非本地将转发向450 要求的邮件操作未完成邮箱不可用例如邮箱忙550 要求的邮件操作未完成邮箱不可用例如邮箱未找到或不可访问451 放弃要求的操作处理过程中出错551 用户非本地请尝试452 系统存储不足要求的操作未执行552 过量的存储分配要求的操作未执行553 邮箱名不可用要求的操作未执行例如邮箱格式错误354 开始邮件输入以.结束554 操作失败4编程思路通过继承CAsyncSocket重载其中的OnAcceptOnCloseOnReceive函数OnAccept用来接收客户端请求建立连接OnReceive实现对客户端的监听并对请求做出响应OnClose关闭连接。函数的实现在SMTPsocket.cpp文件中。其中用户名密码需要用base64编码发送邮件的内容以及附件也是base64编码我的项目中的base.h文件负责处理这些编码问题。在窗口初始化时就创建了一个socket用来连接客户端所以我的程序界面上并没有任何按钮窗口打开时socket就建立好了。具体实现请参照代码。五、实验效果首先配置本地的SMTP的邮箱。在这里使用Outlook UWP客户端。选择类型为Internet电子邮件之后主要将电子邮件地址传入电子邮件服务器传出电子邮件服务器设为本地地址127.0.0.1账户类型选择POP3下面的身份验证以及SSL均取消。其他选项随意填。完成后登陆。打开SMTP服务器。用之前配置好的邮箱发送一封邮件SMTP服务器收到并记录交互过程再发一封带有图片附件的服务器接收并显示图片左边日志上方保留了上次的交互过程。至此实验完成。

更多文章