标题：邮件传输协议
协议简介
SMTP的一个重要特点是它能够在传送中接力传送邮件，传送服务提供了进程间通信环境（IPCE），此环境可以包括一个网络，几个网络或一个网络的子网。理解到传送系统（或IPCE）不是一对一的是很重要的。进程可能直接和其它进程通过已知的IPCE通信。邮件是一个应用程序或进程间通信。邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。更特别的是，邮件可以通过不同网络上的主机接力式传送。
是因特网电子邮件系统首要的应用 层协议。它使用由TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大多数应用层协议一样，SMTP也存在两个 端：在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服 务器在向其他邮件服务器发送邮件消息时，它是作为SMTP客户在运行。当一个邮件服务器从其他邮件服务器接收邮件消息时，它是作为SMTP服务器在运行。
SMTP协议与人们用于面对面交互的礼仪之间有许多相似之处。首先，运行在发送端邮件服务器主机上的SMTP客户，发起建立一个到运行在接收端邮件服务 器主机上的SMTP服务器端口号25之间的TCP连接。如果接收邮件服务器当前不在工作，SMTP客户就等待一段时间后再尝试建立该连接。这个连接建立之 后，SMTP客户和服务器先执行一些应用层握手操作。就像人们在转手东西之前往往先自我介绍那样，SMTP客户和服务器也在传送信息之前先自我介绍一下。 在这个SMTP握手阶段，SMTP客户向服务器分别指出发信人和收信人的电子邮件地址。彼此自我介绍完毕之后，客户发出邮件消息。SMTP可以指望由 TCP提供的可靠数据传输服务把该消息无错地传送到服务器。如果客户还有其他邮件消息需发送到同一个服务器，它就在同一个TCP连接上重复上述过程;否 则，它就指示TCP关闭该连接。[1]
SMTP模型
SMTP设计基于以下通信模型：针对用户的邮件请求，发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出，由接收SMTP接收，而应答则反方面传送。
一旦传送通道建立，SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收，则返回OK应答；如果不能接收到，则发出拒绝接收应答（但不中止整个邮件操作），双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列，如果接收者成功处理了邮件，则返回OK应答。
SMTP提供传送邮件的机制，如果接收方与发送方连接在同一个传送服务下时，邮件可以直接由发送方主机传送到接收方主机；或者，当两者不在同一个传送服务下时，通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力，它必须拥有最终目的主机地址和邮箱名称。
MAIL命令参数是回复路径，它指定邮件从何处来；而RCPT命令的参数是转发路径的，它指定邮件向何处去。向前路径是源路径，而回复路径是返回路径（它用于发生错误时返回邮件）。
当同一个消息要发往不同的接收者时，SMTP遇到了向不同接收者发送同一份数据的复制品的问题，邮件命令和应答有一个比较奇怪的语法，应答也有一个数字代码。在下面，例子中可以看到哪些使用实际的命令和应答。完整的命令和应答在第四节。
命令与应答对大小写不敏感，也就是说，命令和应答可以是大写，小写或两者的混合，但这一点对用户邮件名称却不一定是对的，因为有的主机对用户名大小写是敏感的。这样SMTP实现中就将用户邮箱名称保留成初始时的样子，主机名称对大小写不敏感。
命令与应答由ASCII字母表组成，当传送服务提供8位字节传送通道，每7位字符正确传送，而最高位被填充为0。当指定一般的命令或应答格式后，参数会由一些类似于语言的字符串表示出来，如""或""，这里尖括号表示这是一种类似于语言的变量。
SMTP过程
本节提供了SMTP中的一些过程。头一个说明的是基本发送过程（定义为发送操作）。下来描述向前传送邮件，确认邮箱名称和扩展邮件列表，发送到终端和打开关闭交换。在本节的最后是对中断，邮件域的说明。本节的例子只是一部分命令和应答的序列，完整的例子见附录F。
1、MAIL在SMTP发送操作中有三步，操作由MAIL命令开始给出发送者标识。一系列或更多的RCPT命令紧跟其后，给出了接收者信息，然后是DATA命令列出发送的邮件内容，最后邮件内容指示符确认操作。
过程中的第一步是MAIL命令，< reverse-path >包括源邮箱。
MAIL FROM: 
此命令告诉接收者新的发送操作已经开始，请复位所有状态表和缓冲区。它给出反向路径以进行错误信息返回。如果请求被接收，接收方返回一个250 OK应答。中不止包括了邮箱，它包括了主机和源邮箱的反向路由，其中的第一个主机就是发送此命令的主机。
过程中的第二步是发送RCPT命令。
RCPT TO: 
此命令给出向前路径标识接收者，如果命令被接收，接收方返回一个250 OK应答，并存储向前路径。如果接收者未知，接收方会返回一个550 Failure应答。此过程可能会重复若干次。
不仅包括邮件，它是主机和目的邮箱的路由表，在其中的第一个主机就是接收命令的主机。
过程中的第三步是发送DATA命令。
DATA 
如果命令被接收，接收方返回一个354 Intermediate应答，并认定以下的各行都是信件内容。当信件结尾收到并存储后，接收者发送一个250 OK应答。因为邮件是在传送通道上发送，因此必须指明邮件内容结尾，以便应答对话可以重新开始。SMTP通过在最后一行仅发送一个句号来表示邮件内容的结束，在接收方，一个对用户透明的过程将此符号过滤掉，以不影响正常的数据。
注意：邮件内容包括如下提示：Date, Subject, To, Cc, From。
邮件内容指示符确认邮件操作并告知接收者可以存储和再发送数据了。如果此命令被接收，接收方返回一个250 OK应答。DATA命令仅在邮件操作未完成或源无效的情况下失败。
上面所述的过程是一个发送操作。这些命令只能以上面的顺序使用。下例表示了在一个发送操作中这些命令的使用。
------------------------------------------------------------- 
SMTP过程例子 此例是在Alpha.ARPA主机的Smith发送邮件给Beta.ARPA主机的Jones，Green和Brown的，这里假定主机Alpha与主机Beta直接相连。
S: MAIL FROM:
R: 250 OK
S: RCPT TO:
R: 250 OK
S: RCPT TO:
R: 550 No such user here
S: RCPT TO:
R: 250 OK
S: DATA
R: 354 Start mail input; end with .
S: Blah blah blah...
S: ...等等
S: .
R: 250 OK
此信被前两个人接收，而第三个人在此主机上没有邮箱。
-------------------------------------------------------------
2、 转发下面是一些中目的地址不正确的，但接收者知道正确的目的地址的例子。在这些例子中，下列应答之一应该允许发送方与获得正确地址。
251：用户不在本地；将向前发送到。
这个应答意味着，接收方SMTP知道用户的邮箱在另外的主机上，而且意味着将在未来使用正确的转向路径。请注意，主机或者用户，或者它们两者是不同的。接收方负责传送消息。
551 ：用户非本地，请尝试
这个应答意味着接收SMTP知道用户的邮箱在另外的主机上，并意味着使用了正确的转发路径。注意请注意，主机或者用户，或者它们两者是不同的。接收方拒绝接收此用户的信件，发送者必须根据提供的信息重新发送或者向原发送者返回错误信息。
下例显示了这些响应的应用。
转发的例子
S: RCPT TO:
R: 251 User not local; will forward to 
或者
S: RCPT TO:
R: 551 User not local; please try 
-------------------------------------------------------------
3、确认和扩展SMTP提供了另外的确认用户名和扩展邮件列表的功能。这些功能由VREF和EXPN命令完成，它们都以字符串为参数。对于VREF命令，字符串参数指的是用户名，对此命令的响应要包括用户的命名和用户的邮箱。对于EXPN命令，字符串参数指的是邮件列表，对此命令的响应多于一个，它们要包括所有列表中用户的命名和他们的邮箱。
“用户名”是一个多余的项目，它是故意被加上的。如果主机采用VREF命令和EXPN命令，最后本地邮箱必须提供用户名使它被主机确认。如果主机选择由另外的字符串作为用户名，也是允许的。
在一些主机中，邮箱列表和一个邮箱的代名有一点不清楚，因为一般的数据结构可能包括两种类型的入口。如果要发出对邮件列表的确认，应该给出确定响应。在接收到这个消息后，主机将把邮件传送到列表上所有的地址上去，如果没有接收到确定响应，就会报告错误。例如，"550 That is a mail list, not a user name"。如果请求用于扩展一个用户名，可能通过返回包括一个名字的列表来形成确定响应，如果没有接收到确定响应，就会报告错误。（例如， "550 That is a user name, not a mailing list"）。
在多个响应的情况下（通常是对于EXPN而言的），每个应答指定一个邮箱。在模糊请求的情况下，例如"VRFY Smith"，这里两个Smith的响应必须是"553 User ambiguous"。
确认用户名的情况如下例所示：例3：
------------------------------------------------------------- 
确认用户名
S: VRFY Smith R: 250 Fred Smith 
或者
S: VRFY Smith
R: 251 User not local; will forward to 
或者
S: VRFY Jones
R: 550 String does not match anything.
或者
S: VRFY Jones
R: 551 User not local; please try 
或者
S: VRFY Gourzenkyinplatz
R: 553 User ambiguous.
-------------------------------------------------------------
邮箱列表要求多个响应的情况如下例所示：
------------------------------------------------------------- 
扩展邮件列表的例子
S: EXPN Example-People
R: 250-Jon Postel 
R: 250-Fred Fonebone 
R: 250-Sam Q. Smith 
R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>
R: 250-
R: 250 
或者
S: EXPN Executive-Washroom-List
R: 550 Access Denied to You.
-------------------------------------------------------------
VERF和EXPN命令的字符串命令参数因为具体实现的不同而不能再加以限制了。在一些系统上，EXPN命令的参数可能是一个包含邮件列表的文件名，但是在Internet上有许多不同的文件结构。
VRFY和EXPN命令在最小实现中并不包括，当它们实现时，它们也不要求被在传送间实现。
4、发送信件(mailing)和获得信件(sending)SMTP的主要目的是将邮件发送到用户的邮箱中。由一些主机提供的类似的功能是把邮件送至用户的终端（如果用户正打开终端）。将邮件送到用户的邮箱中称为发送信件（mailing）；而送至用户终端则称之为获得信件（sending）。因为在一些主机上，这两者的实现十分类似，所以它们同时被放入了SMTP中。然而，获得信件命令在SMTP的最小实现中是没有的。用户应该具有控制向终端上写信息的能力。大部分主机允许用户接受或者拒绝类似的信息。
下面三个命令被定义来支持获得信件。它们被用于邮件命令而不是MAIL命令，指示接收SMTP这种操作的特殊意义：
SEND FROM: 
SEND命令要求邮件内容直接传送到用户终端。如果用户未打开终端（或者未接收终端信息），450响应将返回一个RCPT命令。如果信息被成功发送，此操作成功。
SOML FROM: 
Send或者MaiL命令要求将邮件内容直接发送到用户的终端上（如果用户在终端上）。如果用户不在终端上，邮件内容直接进入邮箱。如果邮件被发送到用户终端或者用户信箱，发送操作成功。
SAML FROM: 
Send和MaiL命令要求邮件内容直接发送到用户终端上（如果用户在终端上）。不管怎么样，信件都会进入信箱。如果信件进入信箱，发送操作成功。
用于MAIL命令的响应和这些命令的响应相同。
5、打开和关闭当打开传送通道时，要交换一些信息以确定双方的身份。以下的命令是用于打开和关闭的：
HELO 
QUIT 
在HELLO命令中，主机自己发送命令，此命令可以被解释为：“你好，我是XX”。
-------------------------------------------------------------
打开联结的例子
R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
S: HELO USC-ISIF.ARPA
R: 250 BBN-UNIX.ARPA
-------------------------------------------------------------
-------------------------------------------------------------
关闭联结的例子
S: QUIT
R: 221 BBN-UNIX.ARPA Service closing transmission channel
-------------------------------------------------------------
6、转发转发路径可能是如下格式："@ONE,@TWO:JOE@THREE"，在这里，ONE，TWO和THREE是主机。这种格式用于强调地址和路径的区别。邮箱是绝对地址，路径是关于如何到达的信息。这两个概念不应该被混淆。
概念上，转发路径的元素被移动到回复路径作为从一个SMTP服务器到另一个SMTP服务器的信息。回复路径是一个反向数据源路径，例如从当前信息的位置到发起者的位置。当一个SMTP服务器从转发路径中删除自己的标记并将它插入到回复路径中时，它必须使用它发送环境能够理解的名称来进行，以防它的名称在不同的环境中被理解为不同的名字。
如果当SMTP接收到信息的转发路径的第一个元素不是此SMTP的标记时，此元素不从转发路径中删除，而被用来决定下一个应该发送到的SMTP服务器。在任何情况下，SMTP都将自己的标记加入反向路径中。
使用源路径时，接收SMTP接收转发的邮件并发送到另一接收SMTP服务器上。接收服务器可以接受或拒绝转发本地用户的邮件。接收SMTP通过将它自己的标记从转发路径移至回复路径的开始处来改变命令参数。这时，接收SMTP变成了发送SMTP，也就建立了到下一个转发路径中SMTP的通道，然后，它向这个SMTP发送邮件。
在回复路径上的头一个主机应是发送SMTP命令的主机，在转发路径上第一个主机应是接收SMTP命令的主机。
注意：转发路径和回复路径出现在SMTP命令和应答中，但不一定要出现在信息中。也就是说，没有必须要这样的路径特别这种格式出现在信息头的"To:"，"From:"和"CC:"等域中。
如果SMTP服务器接受了转发任务，但后来它发现因为转发路径不正确或者其它原理无法发送邮件，它必须建立一个"undeliverable mail"信号，将它此信号送到此信的发主者那里。
此信号必须是从此主机的SMTP服务上发出的，当然了，此服务器不应该再报告出错信息的错误。一种阻止这种出错报告循环的情况是在信号的邮件命令的回复路径上置空。在传送此信息时，允许将回复路径也置为空。一个MAIL命令后的回复路径为空表现为如下形式：
MAIL FROM:<>
下例中显示了不可传送的邮件信息。此信息是对从HOSTW上的JOE发出的邮件经过在HOSTX需要经过HOSTZ到达HOSTY时出错的回应。我们看到的例子是在HOSTX和HOSTY之间发生的。
-------------------------------------------------------------
不可传送邮件信息的例子
S: MAIL FROM:<>
R: 250 ok
S: RCPT TO:<@HOSTX.ARPA:JOE@HOSTW.ARPA>
R: 250 ok
S: DATA
R: 354 send the mail data, end with .
S: Date: 23 Oct 81 11:22:33
S: From: SMTP@HOSTY.ARPA
S: To: JOE@HOSTW.ARPA
S: Subject: Mail System Problem
S:
S: Sorry JOE, your message to SAM@HOSTZ.ARPA lost.
S: HOSTZ.ARPA said this:
S: "550 No Such User"
S: .
R: 250 ok
-------------------------------------------------------------
7、 域域是最近被引入ARPA Internet邮件系统的。使用域可以使地址空间从一个平面的普通字符串主机名变成全局地址的一个层次结构。主机由一个域名取代，起始主机是由一系列元串组成，它们由逗号按最特殊到一般的顺序排列。
例如，"USC-ISIF.ARPA"，"Fred.Cambridge.UK"和"PC7.LCS.MIT.ARPA"可能是主机-域标识符。
无论域名在SMTP中如何使用，只有正式的名称才可以被使用，不可以使用假名或昵称。
8、改变角色TURN命令可以用来改变在传输信道上通信的程序的角色。如果程序A现在是发送SMTP，它发送TURN命令并接到OK应答（250）后，它就变为接收SMTP了。同理，程序B也可以从接收SMTP变为发送SMTP。若要拒绝改变角色，接收方可以发送502作为应答。
注意：此命令是可选的。在使用TCP的传输信道时，一般不使用此命令。然而，当建立传输信道的代价比较大时，此命令很有用。例如，此命令可以支持一般公共交换电话系统作为传输信道。
SMTP命令
SMTP命令定义了邮件传输或由用户定义的系统功能。它的命令是由结束的字符串。而在带有参数的情况下，命令本身由和参数分开，如果未带参数可以直接和连接。邮箱的语法格式必须和接收站点的格式一致。下面讨论SMTP命令和应答。
发送邮件操作涉及到不同的数据对象，它们由不同的参数相互连接。回复路径就是MAIL命令的参数，而转发路径则是RCPT命令的参数，邮件日期是DATA命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要求有不同的缓冲区来存储这些对象，也就是说，有一个回复路径缓冲区，一个转发路径缓冲区，一个邮件内容缓冲区。特定的命令产生自己的缓冲区，或使一个或多个缓冲的内容被清除。
1、HELLO 命令此命令用于向接收SMTP确认发送SMTP。参数域包括发送SMTP的主机名。接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。引命令和OK响应确认发送和接收SMTP进入了初始状态，也就是说，没有操作正在执行，所有状态表和缓冲区已经被子清除。
2、MAIL 命令此命令用于开始将邮件发送到一个多个邮箱中。参数域包括回复路径。返回路径中包括了可选的主机和发送者邮箱列表。当有主机列表时，它是一个回复路径源，它说明此邮箱是由在表中的主机一一传递发送（第一个主机是最后一个接收到此邮件的主机）过来的。此表也有作向发送者返回非传递信号的源路径。因为每个传递主机地址都被加在此表起始处，它就必须使用发送IPCE而不是接收IPCE（如果它们不是一个IPCE的话）清楚的名称。一些出错信息的回复路径可能就是空的。
此命令清除回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区，并且将此命令的回复路径信息插入到回复路径缓冲区中。
3、RECIPIENT命令此命令用于确定邮件内容的唯一接收者；多个接收者将由多个此命令指定。转发路径中包括一个可选的主机和一个必须的目的邮箱。当出现主机列表时，这就是一个源路径，它指明邮件必须向列表中的上一个主机发送。如果接收SMTP未实现邮件的传递发送，就会返回如未知本地用户（550）的信息给用户。
当邮件被传递发送时，传递主机必须将自己的名称由转发路径的开始处移至回复路径的结束处。当邮件最终到达目的地时，接收SMTP将以它的主机邮件格式自己的名称插入目标邮件中。例如，由传递主机A接收的带有如下参数的邮件时，
FROM:
TO:<@HOSTA.ARPA,@HOSTB.ARPA:USERC@HOSTD.ARPA>
将会变成如下形式：
FROM:<@HOSTA.ARPA:USERX@HOSTY.ARPA>
TO:<@HOSTB.ARPA:USERC@HOSTD.ARPA>.
此命令导致它的转发路径参数加入转发路径缓冲区中。
DATA (DATA)
接收者将跟在命令后的行作为邮件内容。此命令导致此命令后的邮件内容加入邮件内容缓冲区。邮件内容可以包括所有128个ASCII码字符。邮件内容由只包括一个句号的行结束，也就是如下的字符序列："."，它指示了邮件的结束。
邮件内容的结束指示要求接收者现在就处理保存的邮件内容。此过程将回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区的内容全部清空。如果操作成功，接收者必须返回OK应答；如果失败也必须返回失败应答。
当接收SMTP收到一条信息时，无论是用作转发还是此邮件已经到达目的地，它都必须在邮件内容的开始处加上时间戳这一行，这一行指示了接收到邮件主机和发出此邮件主机的标识，以及接收到邮件内容的时间和日期。转发的信件将有多行这样的时间戳。当接收SMTP作最后一站的传送时，它将返回路径信息行插入邮件中。此行包括了发送命令中的的信息。在这里，最后一站的传送的意思是邮件将被送到目的用户手中，但在一些情况下，邮件可能需要更进一步的加工并由另外的邮件系统传送。
可能在返回路径中的邮箱与实际发送的邮件不一致，这个情况可能发生在需要传送一个特定的错误处理信箱而不是信件发送者那里。上面所述说明了，最后的邮件内容由一个返回路径行，和在其后的一个或多个时间戳行构成。这些行后面是邮件内容的头和体信息。
当处理后面的邮件数据指示部分成功时就需要特定的说明。这种情况可能发生在发送SMTP发现当邮件需要传送给多个用户时，只能够成功地向其中的一部分发送信息这种情况下。在这种情况下，必须对DATA命令发送OK应答，而接收SMTP组织并发送一个“不可传递邮件”信息到信息的发送者。在此信息中或者发送一个不成功接收者的列表，或者每次发送一个不成接收者，而发送多次。所有不可传递邮件信息由MAIL命令发送。
-------------------------------------------------------------
返回路径和接收时间戳例子
Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:JOE@ABC.ARPA> 
Received: from GHI.ARPA by JKL.ARPA ; 27 Oct 81 15:27:39 PST
Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST
Received: from ABC.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST
Date: 27 Oct 81 15:01:01 PST 
From: JOE@ABC.ARPA 
Subject: Improved Mailing System Installed 
To: SAM@JKL.ARPA 
This is to inform you that ... 
-------------------------------------------------------------
4、SEND 命令此命令用于开始一个发送命令，将邮件发送到一个或多个终端上。参数域包括了一个回复路径，此命令如果成功就将邮件发送到终端上了。
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时，表示这是一个传送路径，邮件就是经过这个路径上的每个主机发送到这里的（列表上第一个主机是最后经手的主机）。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处，它就必须使用发送IPCE而不是接收IPCE（如果它们不是一个IPCE的话）清楚的名称。一些出错信息的回复路径可能就是空的。
此命令清除回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区，并且将此命令的回复路径信息插入到回复路径缓冲区中。
5、SEND OR MAIL (SOML)命令此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上，或者传送到邮箱中。对于每个接收者，如果接收者终端打开，邮件内容将被传送到接收者的终端上，否则就送到接收者的邮箱中。参数域包括回复路径，如果成功地将信息送到终端或邮箱中此命令成功。
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时，表示这是一个传送路径，邮件就是经过这个路径上的每个主机发送到这里的（列表上第一个主机是最后经手的主机）。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处，它就必须使用发送IPCE而不是接收IPCE（如果它们不是一个IPCE的话）清楚的名称。一些出错信息的回复路径可能就是空的。
此命令清除回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区，并且将此命令的回复路径信息插入到回复路径缓冲区中。
6、SEND AND MAIL (SAML)命令此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上，并传送到邮箱中。如果接收者终端打开，邮件内容将被传送到接收者的终端上和接收者的邮箱中。参数域包括回复路径，如果成功地将信息送到邮箱中此命令成功。
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时，表示这是一个传送路径，邮件就是经过这个路径上的每个主机发送到这里的（列表上第一个主机是最后经手的主机）。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处，它就必须使用发送IPCE而不是接收IPCE（如果它们不是一个IPCE的话）清楚的名称。一些出错信息的回复路径可能就是空的。
此命令清除回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区，并且将此命令的回复路径信息插入到回复路径缓冲区中。
7、RESET (RSET)命令此命令指示当送邮件操作将被放弃。任何保存的发送者，接收者和邮件内容应该被抛弃，所有缓冲区和状态表应该被清除，接收方必须返回OK应答。
8、VERIFY (VRFY)命令此命令要求接收者确认参数是一个用户。如果这是（已经知道的）用户名，返回用户的全名和指定的邮箱。此命令对回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区没有影响。
9、EXPAND (EXPN)命令此命令要求接收者确认参数指定了一个邮件发送列表，如果是一个邮件发送列表，就返回表中的成员。如果这是（已经知道的）用户名，返回用户的全名和指定的邮箱。此命令对回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区没有影响。
10、HELP (HELP)命令此命令导致接收者向HELP命令的发送者发出帮助信息。此命令可以带参数，并返回特定的信息作为应答。此命令对回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区没有影响。
11、NOOP (NOOP)命令此命令不影响任何参数和已经发出的命令。它只是说明没有任何操作而不是说明接收者发送了一个OK应答。此命令对回复路径缓冲区，转发路径缓冲区和邮件内容缓冲区没有影响。
12、QUIT (QUIT)命令此命令指示接收方必须发送OK应答然后关闭传送信道。接收方在接到QUIT命令并做出响应之前不应该关闭通信信道。发送方在发送QUIT命令和接收到响应之前也不应该关闭信道。即使出错，也不应该关闭信道。如果连接被提前关闭，接收方应该象接收到RSET命令一样，取消所有等待的操作，但不恢复原先已经做过的操作。而发送方应该象接收到暂时错误（4XX）一样假定命令和操作仍在支持之中。
13、TURN (TURN)命令此命令指定接收方要么发送OK应答并改变角色为发送SMTP，要么发送拒绝信息并保持自己的角色。如果程序A现在是发送SMTP，它发出TURN命令后接收到OK（250）应答，它就变成了接收SMTP。程序A就进入初始状态，好像通信信道刚打开一样，这时它发送220准备好服务信号。如果程序B现在是接收SMTP，它发出TURN命令后接收到OK（250）应答，它就变成了发送SMTP。程序A就进入初始状态，好像通信信道刚打开一样，这时它准备接收220准备好服务信号。
若要拒绝改变角色，接收方可以发送502应答。
对于这些命令的顺序有一定的限制。对话的第一个命令必须是HELLO命令，此命令在此后的会话中也可以使用。如果HELLO命令的参数不可接受，必须由返回一个501失败应答，同时接收到的SMTP必须保持在与刚才一致的状态下。 NOOP，HELP,EXPN和VRFY命令可以在会话的任何时候使用。MAIL，SEND，SOML或SAML命令开始一个邮件操作。一旦开始了以后就要发送RCPT和DATA命令。邮件操作可以由RSET命令终止。在一个会话中可以有一个或多个操作。
如果在操作开始参数不可接受，必须返回501失败应答，同时接收到的SMTP必须保持在与刚才一致的状态下。如果操作中的命令顺序出错，必须返回503失败应答，同时接收到的SMTP必须保持在与刚才一致的状态下。
14、QUIT命令会话的最后一个命令必须是QUIT命令。此命令在会话的其它时间不能使用。
COMMAND语法格式
命令是由命令码和其后的参数域组成的。命令码是四个字母组成的，不区别大小写。因为下面的命令的作用是相同的：
MAIL Mail mail MaIl mAIl
这对于引导任何参数值的标记也是适用的，如TO和to就是一样的。命令码和参数由一个或多个空格分开。然而在回复路径和转发路径中的参数是区别大小写的。特别是在一些主机上，"smith"和"Smith"就根本不是一个用户。
参数域由不定长的字符串组成，它由结束，接收方在完全接收到此序列前不会采取任何行动。方括号代表可选的参数域。如果不选择的话，系统选择默认的设置。
下面是SMTP命令： HELO MAIL FROM: 
RCPT TO: 
DATA 
RSET 
SEND FROM: 
SOML FROM: 
SAML FROM: 
VRFY 
EXPN 
HELP [ ] 
NOOP 
QUIT 
TURN 
上面参数域的格式在下面给BNF的格式给出，其中的"..."代表对于一个域的一次或多次的重复。
::= 
::= 
::= "<" [ ":" ] ">"
::= | "," 
::= "@" 
::= | "." 
::= | "#" | "[" "]"
::= "@" 
::= | 
::= 
::= | 
::= | 
::= | | "-"
::= <字符串> | <字符串> "." 
<字符串> ::= <字符> | <字符> <字符串>
::= """ """
::= "\" | "\" | | 
<字符> ::= | "\" 
::= "." "." "." 
::= | 
::= 
::= 回车符（ASCII码13） ::= （ASCII码10）
::= 空格（ASCII码32） ::=由一个，两个或三个数字组成的介于0-255之间的数字
::= 所有A-Z的52个大小写英文字母
::= 128个ASCII字符，但不包括空格和特殊字符
::= 0-9数字
::=不包括，，"或\的128个ASCII字符
::=所有128个ASCII字符
::= "<" | ">" | "(" | ")" | "[" | "]" | "\" | "." | "," | ";" | ":" | "@" """ 或控制字符
注意： "\"是一个转意字符，它表示在其后的字符代表另外的意义。例如"Joe\,Smith"用于表示单独一个由逗号分隔的用户名。主机通常由转化为地址的名称代表。注意：域的名称元素是正式的名称，不能够使用昵称或假名。
有时候名称的转变机制可能不知道主机，这就造成了通信的阻塞。为了解决这个问题，可以采取两种方法：一种方法是：在"#"后加入一个十进制数表示主机地址；另一种方法是在其后加入32位的IP地址，IP地址的形式是由句号分隔的四个介于0-255之间的十进制数。时间戳行和返回路径行的格式通常由下面定义：
::= "Return-Path:" 
::= "Received:" 
::= ";" 
::= "FROM" <域> 
::= "BY" <域> 
::= [] [] [] []
::= "VIA" <连接> 
::= "WITH" <协议> 
::= "ID" <字符串> 
::= "FOR" <路径> 
<连接> ::= 在网络信息中心注册的连接的标准名称
<协议> ::= 在网络中心注册的协议的名称
::= <日期> <时间>
<日期> ::= <日> <月> <年>
<时间> ::= <小时> ":" <分> ":" <秒> <时区>