前言
本实验主要是用smtp协议发邮件,收邮件要用到POP3,时间有限,只实现了发邮件,实现过程放在总体设计中
白嫖容易,创作不易,本文原创,转载请注明!!!
源码和可运行程序:
链接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2wLrehIg
提取码:Lin2
计算机网络课程设计:
计算机网络课程设计之网络聊天程序的设计与实现
计算机网络课程设计之Tracert与Ping程序设计与实现
计算机网络课程设计之基于 IP 多播的网络会议程序
计算机网络课程设计之网络嗅探器的设计与实现
计算机网络课程设计之电子邮件客户端程序设计与实现
计算机网络课程设计之TELNET 终端设计与实现
计算机网络课程设计之网络代理服务器的设计与实现
计算机网络课程设计之简单 Web Server 程序的设计与实现
Qt入门系列:
Qt学习之C++基础
Qt学习之Qt安装
Qt学习之Qt基础入门(上)
Qt学习之Qt基础入门(中)
Qt学习之Qt基础入门(下)
创作不易,整个课程设计程序3000多行代码,所有实验都写在了一个程序中,时间有限,能力不足,转载望注明!!!
本文链接
个人博客:https://ronglin.fun/archives/272
PDF链接:https://pan.baidu.com/s/1lk91DrJrAQfB3CzTyWYSqQ 提取码:Lin2
CSDN: https://blog.csdn.net/RongLin02/article/details/122510502
实验题目
电子邮件客户端程序设计与实现
实验目的
参照教材 6.5 节原理,设计一个电子邮件客户端程序。
总体设计
(含背景知识或基本原理与算法、或模块介绍、设计步骤等)
首先模拟一下smtp是如何发邮件的
参考博客:
https://www.cnblogs.com/feigen/p/11150757.html
https://blog.csdn.net/qq_35644234/article/details/68961603
本文以163邮箱为例,但是QQ邮箱同理,只需要把地址由smtp.163.com
换为smtp.qq.com
文本格式放在附录
授权码
授权码的获取,登录163邮箱 点击设置
-> POP3/SMTP/IMAP
然后点击下边的新增授权码,然后将授权码保存下来
SMTP登录
打开cmd输入telnet smtp.163.com 25
回车
220 163.com Anti-spam GT for Coremail System (163com[20141201])
这句话的意思是连接163邮箱的smtp服务,连接IP为smtp.163.com
端口为25,返回220说明服务就绪
然后输入HELO smtp.163.com
回车
250 OK
这句话的意思是请求命令完成
然后输入AUTH LOGIN
回车
334 dXNlcm5hbWU6
这句话的意思是要登录163邮箱,334表示等待用户输入
然后要把自己的邮箱账号转化为Base64编码格式,搜索引擎搜索Base64编码工具即可,如下
156xxxxxxxx@163.com
MTU2eHh4eHh4eHhAMTYzLmNvbQ==
然后在命令行输入编码之后的邮箱账号,我这里输入MTU2eHh4eHh4eHhAMTYzLmNvbQ==
回车
334 UGFzc3dvcmQ6
然后334,表示继续等待用户输入
同理,我们要用之前获得的授权码,将授权码也转为Base64格式,如下:
SXXXXXXXXXXXXXXX
U1hYWFhYWFhYWFhYWFhYWA==
然后输入编码之后的授权码,我这里输入U1hYWFhYWFhYWFhYWFhYWA==
回车
235 Authentication successful
返回235,并且登录成功,然后就可以发送邮件了
SMTP发送
发送邮件过程如下,登录成功之后
输入mail from:<156xxxxxxxx@163.com>
回车,这里是设置发件人的信息,也就是我们自己的邮箱账号,返回ok
250 Mail OK
输入rcpt to:<277xxxxxxx@qq.com>
回车,这里是设置收件人的信息,是收件人的邮箱账号,然后返回ok
250 Mail OK
输入data
回车,表示开始传送数据(发送邮件)
354 End data with <CR><LF>.<CR><LF>
然后简要说明一下邮件的格式
from:156xxxxxxxx@163.com
to:277xxxxxxx@qq.com
subject:test
this is content
格式如上,from是发件人,可不设置,to是收件人可不设置,subject是邮件的主题,然后就是正文部分,注意正文部分和subject中间有一个回车
我们依次输入上述内容,输入完成后,正文结束输入一个.
回车
250 Mail OK queued as smtp4,HNxpCgDn3JG5T9Zh70g4EQ--.17592S2 1641435114
然后输入quit
回车
221 Bye
表示退出成功
过程如下 文本格式放在附录
详细设计
(含主要的数据结构、程序流程图、关键代码等)
过程已经明白,然后就是将其集成到Qt中,界面如下
将用户输入邮箱账号和授权码然后点击登录,
在代码中负责用TCP连接SMTP 25端口,然后根据上述流程登录成功,注意要转为Base64码
部分代码如下
//TCP客户端连接"smtp.163.com" 25端口
this->clientsocket->connectToHost("smtp.163.com",25,QTcpSocket::ReadWrite);
同时要根据服务器返回的状态码,判断每一步的命令是否成功,例如,判断登录
this->clientsocket->write("AUTH LOGIN\r\n"); //传输登录命令
this->clientsocket->waitForReadyRead(waitTimeMs); //等待传输完毕
QString recvdata = clientsocket->readAll(); //获得返回数据
successFlag = recvdata.contains("334"); //是否返回了334代码
if(!successFlag)
{
emit this->sendError("登陆命令失败");
this->clientsocket->abort();
return false;
}
然后需要注意在每个指令上用到回车的地方都要加上\r\n
实验结果与分析
首先登录
登录成功,然后输入内容,发送邮件
登录qq邮箱看结果
看到邮件已经成功发送
小结与心得体会
对发送邮件有了更好的理解,尤其是书上的SMTP协议的格式,同时也有了一定的能力用代码发送邮件,对于邮箱这种常用的工具,对它的实现原理有了更好的理解,获益匪浅
=w=
附
cmd 登录SMTP过程文本格式
telnet smtp.163.com 25
220 163.com Anti-spam GT for Coremail System (163com[20141201])
HELO smtp.163.com
250 OK
AUTH LOGIN
334 dXNlcm5hbWU6
MTU2eHh4eHh4eHhAMTYzLmNvbQ==
334 UGFzc3dvcmQ6
U1hYWFhYWFhYWFhYWFhYWA==
235 Authentication successful
mail from:<156xxxxxxxx@163.com>
250 Mail OK
rcpt to:<277xxxxxxx@qq.com>
250 Mail OK
data
354 End data with <CR><LF>.<CR><LF>
from:156xxxxxxxx@163.com
to:277xxxxxxx@qq.com
subject:test
this is content
.
250 Mail OK queued as smtp4,HNxpCgDn3JG5T9Zh70g4EQ--.17592S2 1641435114
quit
221 Bye