电子邮件协议(SMTP协议,POP3协议)
SMTP
STMP(简单邮件传输协议)是因特网电子邮件的核心。如下图所示,SMTP是负责将用户代理(如Outlook)的邮件发送到邮件服务器,以及服务器之间发送邮件的协议。SMTP有两个部分:SMTP客户端和SMTP服务器端。当一个邮件服务器向其它服务器发送邮件时,它就表现为SMTP客户端,当邮件服务器从其他邮件服务器上接收邮件时,它就表现为一个SMTP服务器端。
值得注意的是,SMTP只能传输ASCII码,如果想要传输非ASCII的文字以及图像、视频等,需要将这些数据编码为ASCII码,然后传输完毕后再还原为原始数据。
使用SMTP传输邮件的流程如下所示:
- Alice通过代理并使用SMTP协议将邮件发送到Alice的邮件服务器;
- Alice的邮件服务器发现Alice的邮件,并通过邮件中的收件人信息找到Bob的邮件服务器;
- Alice通过SMTP协议向Bob服务器发送邮件;
- Bob登录代理,通过其它协议(POP3,IMAP,HTML)获得邮件。
使用Telnet访问SMTP服务器
# 通过telnet命令建立起一个SMTP服务器的链接
telnet smtp.qq.com 25
# 得到返回信息220说明链接成功
220 newxmesmtplogicsvrszc1-0.qq.com XMail Esmtp QQ Mail Server.
# 打招呼,发送helo+任意内容
helo qq
# 得到返回250说明对方收到招呼
250-newxmesmtplogicsvrszc1-0.qq.com-9.146.228.40-10806377
250-SIZE 73400320
250 OK
# 输入 auth login进行登录,这里telnet表现为客户端,输入的用户名不会被发送到服务器,只有邮箱授权码会发送到服务器
auth login
# 得到 334 VXNlcm5hbWU6,其中VXNlcm5hbWU6VXNlcm5hbWU6是Username:的Base64格式
334 VXNlcm5hbWU6
# 输入用户名,即自己的qq号,但这里要是qq号的Base64格式
MjQ5ODE0NDI4OUBxcS5jb20=
# 得到334 UGFzc3dvcmQ6,其中UGFzc3dvcmQ6是Password:的Base64格式
334 UGFzc3dvcmQ6
# 输入邮箱授权码,这里之所以输入邮箱授权码而不是密码可能是因为SMTP是明文传输,为了保护密码所以使用邮箱授权码,实际上之前输入的用户名也不会传到服务器端中,应该是用于客户端验证登录的用户是谁,防止发信人伪造发信人信息
略
# 得到235 Authentication successful说明验证成功
235 Authentication successful
# 设置邮件发送方 mail from: <发件人邮箱>
mail from: <2498144289@qq.com>
# 得到250 OK 说明没有问题
250 OK
# 设置邮件接收方 rcpt to : <收件人邮箱>
rcpt to: <646462552@qq.com>
# 得到250 OK 说明没有问题
250 OK
# 输入data表明要发送邮件信息了
data
# 得到354 End data with <CR><LF>.<CR><LF>. 提示用户单独一行的.表示为结束
354 End data with <CR><LF>.<CR><LF>.
# 输入SMTP报文首部(可选)不输入的话会导致邮件信息不全,但邮件仍会发送到收件人
From: Huang
To: Wang
Subject: Happy
# 在报文首部之后紧接着一个空白行,然后输入以ASCII格式表示的报文体
Hi, I am Huang
Good every
..
ABC
TTTT
.
# 在服务器接收到一个单独一行的.后,认为邮件内容结束,返回状态码,如果是250,表示发送成功
250 OK: queued as.
# 输入QUIT离开
QUIT
# 服务端返回221表示结束会话
221 Bye.
在邮箱中可以看到邮件已经成功到达,其中内容与在命令行时有所不同,第一行中“Hi, I am huHuang”,多出了“hu”,这是因为在telnet中输入信息通过退格键消除掉后只是在命令行中消失了,实际上内容仍然存在,即不能使用回车键来消除错误。
POP3
由于SMTP是一个“推”协议,即将数据发送到某个主机的协议,并不具备从某个主机上获得数据的功能。因此,当收件人想通过客户端来获得服务器中发送给自己的邮件时,是不能使用SMTP的。
POP3(第三版的邮局协议)用来将邮件从接收方的邮件服务器传送到接收方的用户代理。这是一个极为简单的邮件访问协议。
使用Telnet访问POP3服务器
# 通过telnet命令建立起一个POP3服务器的链接
telnet smtp.qq.com 110
# 接收到OK表示建立成功
+OK XMail POP3 Server v1.0 Service Ready(XMail v1.0)
# 输入user 用户名
user 2498144289@qq.com
# 接收到OK表示成功
+OK
# 输入pass 邮箱授权码
pass 略
# 接收到OK表示成功
+OK
# 输入list查看邮箱列表
list
# 接收到OK表示成功,并返回所有邮件的序号和长度
+OK
1 30505
2 8021
3 8021
4 64176
5 109297
6 14508
7 12820
8 14608
9 7189
...
# 通过retr来读取某个邮件
retr 1
# 接收到OK表示成功
+OK 30505
Received: from o2.ptr565.wandb.com (o2.ptr565.wandb.com [149.72.42.209])
by newxmmxsza6-11.qq.com (NewMX) with SMTP id AC607444
for <2498144289@qq.com>; Tue, 03 Jan 2023 19:43:06 +0800
X-QQ-mid: xmmxza6-11t1672746186tqq9z3msg
Sender: bounces+8555476-b12e-2498144289=qq.com@em3714.wandb.com
X-QQ-CSender: bounces+8555476-b12e-2498144289=qq.com@em3714.wandb.com
X-QQ-XMAILINFO: MXYxc+vhTT0ahmcsWylbFQztD+qE2zvqnbrlaDHrcRG/It9udGJPyghW/QNKWj
x0zY5cdwm2BK97ZHOuf78SPu7QJQDi7sYPfAjAIXP9
...
# quit
quit
# +OK Bye
+OK Bye