SMTP协议分析及实验
一:SMTP简介
SMTP(Simple Mail Transfer Protocol)简单邮件传输协议,是一种提供可靠且有效传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于传输系统之间的邮件信息并提供与来信有关的通知。
SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。可以很简单地通过Telnet程序来测试一个SMTP服务器SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchangeDNS
SMTP协议发展
  在20咏梅个人资料世纪80年代早期SMTP开始被广泛地使用。当时它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反SMTP发送和接收的机器始终都联网的情况下工作得最好。
  SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。通常,一个网络可以由公用因特网上TCP可相互间访问的主机、防火墙分隔的TCP/IP网络上TCP可相互访问的主机,以及其他LAN/WAN中的主机利用非TCP传输层协议组成。使用SMTP,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关是实现某处理机与其他网络之间的邮件传输。
  在这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一跳IP地址。
  Sendmail是最早实现SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP 实现为一个客户端(消息的发送者)或一个服务器(消息的接受者)。一些其他的流行的SMTP服务器包括Philip Hazel eximIBMPostfixD.J.BernsteinQmail,以及Microsoft Exchange Server.
  由于这个协议开始是基于纯ASCⅡ文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。
  ( 注意:SMTP是一个动员""的协议,它不允许根据需要从远程服务器上“拉”来消息。要做到这点,邮件客户端必须使用POP3法拉利张婷婷IMAP上。另一个,SMTP服务器可以使用ETRN(Extended Turn,扩展回车)命令SMTP上触发一个发送。)
垃圾邮件仍然是个重要的问题。原始的SMTP协议的局限之一在于它没有为发送方进行认证的功能。因此定义了SMTP-AUTH 扩展。由于SMTP 巨大安装基础的网络效应,广阔地修改SMTP或者完全替代它被认为是不现实的。Internet Mail 2000 就是这样一个为替换而做的建议。IRTF 反垃圾邮件研究小组正在研究一些提供简单、灵活、轻量级的、可升级的源端认证的建议。最有可能被接受的建议是Sender Policy Framework 协议。
二:协议的工作原理
SMTP在邮件通信中的位置如下图所示:
1、工作机制:
SMTP通常有两种工作模式:发送SMTP和接收SMTP。具体工作方式为:发送SMTP在接到用户的邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向dns查询远端邮件服务器MX纪录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则
返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答即可。命令和响应都是基于ASCⅡ文本,并以CRLF符结束。响应包括一个表示返回状态的三位数字代码。SMTPTCP协议25端口监听连续请求。
2、连接和发送过程如下:
 
  (1)建立TCP 连接。
  (2)客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收。
  (3)客户端发送RCPT命令,以标识该的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件。
  (4)协商结束,发送邮件,用命令DATA发送。
  (丁思甜5)以“.”号表示结束输入内容一起发送出去,结束此次发送,用QUIT命令退出。
3SMTP协议的邮件路由过程:
  SMTP服务器基于域名服务DNS中计划收件人的域名来路由。SMTP服务器基于DNS中的MX记录来路由,MX记录注册了域名和相关的SMTP中继主机,属于该域的都应向该主机发送。若SMTP服务器 mail.abc 收到一封信要发到shuer@sh.abc,则执行以下过程:
1Sendmail 请求DNS给出主机sh.abcCNAME 记录,如有,假若CNAME(别名记录)到shmail.abc,则再次请求shmail.abcCNAME记录,直到没有为止。
2)假定被CNAMEshmail.abc,然后sendmail请求@abc 域的DNS给出shmail.abcMX记录(邮件路由及记录),shmail MX 5 shmail.abc 10 shmail2.abc
3Sendmail组合请求DNS给出shmail.abcA记录(主机名(或域名)对应的IP地址记录),即IP地址,若返回值为1.2.3.4(假设值)。
4Sendmail1.2.3.4连接,传送这封给shuser@sh.abc 的信到1.2.3.4 这台服务器的SMTP后台程序。
三:SMTP的协议命令及常用应用码格式说明
李子峰吴昕
命令
描述
DATA
开始信息写作
EXPN<string>
验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELO<domain>
向服务器标识用户身份,返回邮件服务器身份
HELP<command>
查询服务器支持什么命令,返回命令中的信息
MAIL FROM<host>
在主机上初始化一个邮件会话
NOOP
无操作,服务器应响应OK
QUIT
终止邮件会话
RCPT TO<user>
标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to
RSET
重置会话,当前传输被取消
SAML FROM<host>
发送邮件到用户终端和邮箱
SEND FROM<host>
发送邮件到用户终端
SOML FROM<host>
发送邮件到用户终端或邮箱
TURN
接收端和发送端交换角
VRFY<user>
用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
应用码
格式说明
501
参数格式错误
502
命令不可实现
503
错误的命令序列
504
命令参数不可实现
211
系统状态或系统帮助响应
214
帮助信息
220
<domain>服务就绪
221
domain>服务关闭
421
domain>服务未就绪,关闭传输信道
250
要求的邮件操作完成
251皮冻的家常做法
用户非本地,将转发向<forward-path
450
要求的邮件操作未完成,邮箱不可用
550
要求的邮件操作未完成,邮箱不可用
451
放弃要求的操作;处理过程中出错
551
用户非本地,请尝试<forward-path
452
系统存储不足,要求的操作未执行
四:实验分析
1、程序运行分析
将程序执行后会得到如下图所示结果:
上图黄线部分有三层信息:
220是邮件服务器返回给客户的响应状态码,它表示邮件服务器准备就绪(service ready)
smtp.qq表示当前进行的响应的邮件服务器的主机名。
Esmtp表示当前邮件服务器支持扩展SMTP协议。
SMTP发送者程序与SMTP接收者程序建立连接后,然后向SMTP接收程序发送问候信息,得到的邮件服务器返回结果如下图:
接着输入如下一行命令:auth login得到如下结果:
其中,SMTP服务器返回的响应状态码为334,它表示SMTP服务器正在等待客户端输入认证信息。然后,将命令行窗口中,选中经过BASE64编码后得到的用户名,复制过来,然后将BASE64编码的密码复制过来,完成认证后的结果如下图所示:
接着将邮件发送者的填写为邮箱地址,得到如下效果图:
其中返回一个250的响应状态码,代表当前操作执行成功。
SMTP协议不要求SMTP邮件接收服务器对mail from命令后面输入的邮件地址进行验证,也就是说,mail from命令后面的邮件地址可以不是发件人的真实邮箱地址,而可以是
其他人的邮箱地址。
将邮件接收者的地址填写完整,得到如下结果:
邮件服务器返回一个250的响应状态码,代表当前操作执行成功。而事实上SMTP协议允许在一个连接通道中连接多个收件人完成余下工作得:
接着输入data命令,表示后面将传送邮件内容。邮件服务器返回354的响应状态码,并等待客户端输入邮件内容。接着输入邮件内容。最后在单独的一行上输入一个“.”作为邮件内容的结束标记.而最后输入quit命令,结束整个邮件的传输过程。SMTP服务器接收到客户端发送的quit命令后,将断开与客户端的网络连接,Telnet程序结束运行,windows命令行窗口退回到DOS提示符状态。
2、数据包分析:
下图为实验过程中抓取的SMTP数据包总体截图:
1)建立连接:
2)MUA根据提示做出的响应,把本地计算机名发送到SMTP服务器:
3SMTP服务器告诉MUA所支持的功能范围:
4)查询是否支持本域的转发即高速服务器邮件来自QQ,询问是否支持该域的转发:
5)返回通告,如下图,表示支持该域转发。
6)询问是够支持传到该域即QQ
7)返回通告,表示支持,可以进行下一步。
8)告诉SMTP服务器开始穿数据:
9)通告信息结束控制符是什么。
10)发送邮件:
以下是在QQ邮箱里收到的邮件截图:
11)告诉MUA,信息已经接收到,接着返回该邮件在服务器中的队列号: