计算机网络课程设计之电子邮件客户端程序设计与实现

前言

本实验主要是用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编码工具即可,如下

[email protected]
MTU2eHh4eHh4eHhAMTYzLmNvbQ==

然后在命令行输入编码之后的邮箱账号,我这里输入MTU2eHh4eHh4eHhAMTYzLmNvbQ==回车

334 UGFzc3dvcmQ6

然后334,表示继续等待用户输入
同理,我们要用之前获得的授权码,将授权码也转为Base64格式,如下:

SXXXXXXXXXXXXXXX
U1hYWFhYWFhYWFhYWFhYWA==

然后输入编码之后的授权码,我这里输入U1hYWFhYWFhYWFhYWFhYWA==回车

235 Authentication successful

返回235,并且登录成功,然后就可以发送邮件了

SMTP发送

发送邮件过程如下,登录成功之后
输入mail from:<[email protected]>回车,这里是设置发件人的信息,也就是我们自己的邮箱账号,返回ok

250 Mail OK

输入rcpt to:<[email protected]>回车,这里是设置收件人的信息,是收件人的邮箱账号,然后返回ok

250 Mail OK

输入data回车,表示开始传送数据(发送邮件)

354 End data with <CR><LF>.<CR><LF>

然后简要说明一下邮件的格式

from:[email protected]
to:[email protected]
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:<[email protected]>
250 Mail OK
rcpt to:<[email protected]>
250 Mail OK
data
354 End data with <CR><LF>.<CR><LF>
from:[email protected]
to:[email protected]
subject:test

this  is content
.
250 Mail OK queued as smtp4,HNxpCgDn3JG5T9Zh70g4EQ--.17592S2 1641435114
quit
221 Bye

猜你喜欢

转载自blog.csdn.net/RongLin02/article/details/122510502