1、简介
SMTP(Simple Mail Transfer Protocol)协议是为了保证电子邮件的可靠和高效传送。TCP/IP 协议的应用层中包含有 SMTP 协议,但事实上其与传输系统和机制无关,仅要求一个可靠的数据流通道。该协议可以工作在 TCP 上,也可以工作在 NCP、NITS 等协议上。在 TCP 上,其使用端口 25 进行传输。SMTP 的一个重要特点是可以在可交互的通信系统中转发邮件。
SMTP 提供了一种邮件传输的机制,当接收方和发送方都在一个网络上时,可以把邮件直传给对方;当双方不在同一个网络上时,需要通过一个或几个中间服务器转发。SMTP 首先由发送方提出申请,要求与接收方 SMTP 建立双向的通信渠道,接收方可以是最终收件人也可以是中间转发的服务器。接收方服务器确认可以建立连接后,双发就可以开始通信。
发送方 SMTP 向接收方发出 MAIL 命令,告知发送方的身份;如果接收方接受,就会回答 OK。发送方再发出 RCPT 命令,告知收件人的身份,接收方 SMTP 确认是否接收或转发,如果同意就回答 OK;接下来就可以进行数据传输了。通信过程中,发送方 SMTP 与接收方 SMTP 采用对话式的交互方式,发送方提出要求,接收方进行确认,确认后才进行下一步的动作。整个过程由发送方控制,有时需要确认几次才可以(如图 1 所示)。
![](https://img-blog.csdn.net/20130707184516796?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGFvenB3YXRlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
为了保证回复命令的有效,SMTP 要求发送方必须提供接收方的服务器及邮箱。邮件的命令和答复有严格的语法定义,并且回复具有相应的数字代码。所有的命令由 ASCII 码组成。命令代码是大小写无关的,如 MAIL 和 mail、mAIL 都是等效的。
目前使用的 SMTP 协议是存储转发协议,意味着其允许邮件通过一系列的服务器发送到最终目的地。服务器在一个队列中存储到达的邮件,等待发送到下一个目的地。下一个目的地可以是本地用户,或者是另一个邮件服务器,如图 2 所示。如果下游的服务器暂时不可用,MTA 就暂时在队列中保存信件,并在以后尝试发送。
![](https://img-blog.csdn.net/20130707184753140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGFvenB3YXRlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2、命令
SMTP 定义了 15 个命令,分别是:HELO、MAIL FROM、RCPT TO、DATA、RSET、SEND FROM、SOML FROM、SAML FROM、VRFY、EXPN、HELP、NOOP、QUIT、TURN。其中 SMTP 工作的基本的命令有 7 个:HELO、MAIL FROM、RCPT TO、DATA、REST、NOOP 和 QUIT。
下面分别对这些命令进行介绍。
HELO:发送方问候接收方,后面是发件人的服务器地址或标识。接收方回答 OK 时标识自己的身份。问候和确认过程表明两台机器可以进行通信,同时状态参量被复位,缓冲区被清空。
MAIL FROM:这个命令用来开始传送邮件,其后面跟随发送方邮件地址(返回邮件地址)。也用来当邮件无法送达时,发送失败通知。为保证邮件的成功发送,发送方的地址应是被对方或中间转发方同意接受的。这个命令会清空有关的缓冲区,为新的邮件做准备。
RCPT TO:这个命令告诉接收方收件人的邮箱。当有多个收件人时,需要多次使用该命令,每次只能指明一个人。如果接收方服务器不同意转发这个地址的邮件,其必须报 550 错误代码通知发送方。如果服务器同意转发,其要更改邮件发送路径,把最开始的目的地(该服务器)换成下一个服务器。
DATA:接收方把该命令之后的数据作为发送的数据。数据被加入数据缓冲区中,以单独一行是“.”的行结束数据。结束行对于接收方同时意味立即开始缓冲区内的数据传送,传送结束后清空缓冲区。如果传送接受,接收方回复 OK。
REST:这个命令用来通知接收方复位,所有已存入缓冲区的收件人数据,发件人数据和待传送的数据都必须清除,接收方必须回答 OK。
NOOP:这个命令不影响任何参数,只是要求接收放回答 OK,不会影响缓冲区的数据。
QUIT:SMTP 要求接收方必须回答 OK,然后中断传输;在收到这个命令并回答 OK 前,接收方不得中断连接,即使传输出现错误。发送方在发出这个命令并收到 OK 答复前,也不得中断连接。
VERY:用于确认接收用户。
SEND:使接收主机知道消息必须送到另一个终端,当前传输被取消。
HELP:查询服务器支持的命令集合。
EXPN:验证给定的邮箱列表是否存在,并扩充邮箱列表。
TURN:请求接收主机向发送主机返回消息。
SAML:发送并邮寄。通知接收主机消息必须发送到其他终端和邮箱。