简单邮件传输协议(SMTP)

时间:2021-01-29 18:08:15

RFC821-简单邮件传输协议(SMTP)(转)

 

 1. 介绍

  简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传
送子系统而且仅要求一条可以保证传送数据单元顺序的通道。附录A,B,C
和D描述了不同传送服务下SMTP的使用。在名词表中还定义了本文档中使用
的术语。
  SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了
进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络
的子网。理解到传送系统(或IPCE)不是一对一的是很重要的。进程可能直
接和其它进程通过已知的IPCE通信。邮件是一个应用程序或进程间通信。邮
件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。更特别的是,邮
件可以通过不同网络上的主机接力式传送。

2. 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。当指定一般的命令或应答格式后,参
数会由一些类似于语言的字符串表示出来,如"<string>"或"<reverse-path>",
这里尖括号表示这是一种类似于语言的变量。

3. SMTP过程  

  本节提供了SMTP中的一些过程。头一个说明的是基本发送过程(定义为
发送操作)。下来描述向前传送邮件,确认邮箱名称和扩展邮件列表,发送到终
端和打开关闭交换。在本节的最后是对中断,邮件域的说明。本节的例子只是一
部分命令和应答的序列,完整的例子见附录F。

3.1. MAIL
  在SMTP发送操作中有三步,操作由MAIL命令开始给出发送者标识。一系列或
更多的RCPT命令紧跟其后,给出了接收者信息,然后是DATA命令列出发送的邮件
内容,最后邮件内容指示符确认操作。

  过程中的第一步是MAIL命令,< reverse-path >包括源邮箱。

  MAIL <SP> FROM:<reverse-path> <CRLF>

  此命令告诉接收者新的发送操作已经开始,请复位所有状态表和缓冲区。
它给出反向路径以进行错误信息返回。如果请求被接收,接收方返回一个
250 OK应答。<reverse-path>中不止包括了邮箱,它包括了主机和源邮箱的反
向路由,其中的第一个主机就是发送此命令的主机。

  过程中的第二步是发送RCPT命令。

  RCPT <SP> TO:<forward-path> <CRLF>

  此命令给出向前路径标识接收者,如果命令被接收,接收方返回一个
250 OK应答,并存储向前路径。如果接收者未知,接收方会返回一个550 Failure
应答。此过程可能会重复若干次。
  <forward-path>不仅包括邮件,它是主机和目的邮箱的路由表,在其中的
第一个主机就是接收命令的主机。 过程中的第三步是发送DATA命令。

DATA <CRLF>

  如果命令被接收,接收方返回一个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:<Smith@Alpha.ARPA>
  R: 250 OK
  S: RCPT TO:<Jones@Beta.ARPA>
  R: 250 OK
  S: RCPT TO:<Green@Beta.ARPA>
  R: 550 No such user here
  S: RCPT TO:<Brown@Beta.ARPA>
  R: 250 OK
  S: DATA
  R: 354 Start mail input; end with <CRLF>.<CRLF>
  S: Blah blah blah...
  S: ...等等
  S: <CRLF>.<CRLF>
  R: 250 OK
  此信被前两个人接收,而第三个人在此主机上没有邮箱。

3.2. 转发  
  下面是一些<forward-path>中目的地址不正确的,但接收者知道正确的目
的地址的例子。在这些例子中,下列应答之一应该允许发送方与获得正确地址。

  251:用户不在本地;将向前发送到<forward-path>。

  这个应答意味着,接收方SMTP知道用户的邮箱在另外的主机上,而且意味
着将在未来使用正确的转向路径。请注意,主机或者用户,或者它们两者是不
同的。接收方负责传送消息。

  551 :用户非本地,请尝试<forward-path>

  这个应答意味着接收SMTP知道用户的邮箱在另外的主机上,并意味着使用
了正确的转发路径。注意请注意,主机或者用户,或者它们两者是不同的。接
收方拒绝接收此用户的信件,发送者必须根据提供的信息重新发送或者向原发
送者返回错误信息。 下例显示了这些响应的应用。

  转发的例子
  S: RCPT TO:<Postel@USC-ISI.ARPA>
  R: 251 User not local; will forward to <Postel@USC-ISIF.ARPA>
  或者
  S: RCPT TO:<Paul@USC-ISIB.ARPA>
  R: 551 User not local; please try <Mockapetris@USC-ISIF.ARPA>

3.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 <Smith@USC-ISIF.ARPA>
  或者
  S: VRFY Smith
  R: 251 User not local; will forward to <Smith@USC-ISIQ.ARPA>
  或者
  S: VRFY Jones
  R: 550 String does not match anything.
  或者
  S: VRFY Jones
  R: 551 User not local; please try <Jones@USC-ISIQ.ARPA>
  或者
  S: VRFY Gourzenkyinplatz
  R: 553 User ambiguous.

  邮箱列表要求多个响应的情况如下例所示:
  S: EXPN Example-People
  R: 250-Jon Postel <Postel@USC-ISIF.ARPA>
  R: 250-Fred Fonebone <Fonebone@USC-ISIQ.ARPA>
  R: 250-Sam Q. Smith <SQSmith@USC-ISIQ.ARPA>
  R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>
  R: 250-<joe@foo-unix.ARPA>
  R: 250 <xyz@bar-unix.ARPA>
  或者
  S: EXPN Executive-Washroom-List
  R: 550 Access Denied to You.

  VERF和EXPN命令的字符串命令参数因为具体实现的不同而不能再加以限
制了。在一些系统上,EXPN命令的参数可能是一个包含邮件列表的文件名,
但是在Internet上有许多不同的文件结构。
  VRFY和EXPN命令在最小实现中并不包括,当它们实现时,它们也不要求
被在传送间实现。 

3.4. 发送信件(mailing)和获得信件(sending)  
  SMTP的主要目的是将邮件发送到用户的邮箱中。由一些主机提供的类似
的功能是把邮件送至用户的终端(如果用户正打开终端)。将邮件送到用户
的邮箱中称为发送信件(mailing);而送至用户终端则称之为获得信件
(sending)。因为在一些主机上,这两者的实现十分类似,所以它们同时
被放入了SMTP中。然而,获得信件命令在SMTP的最小实现中是没有的。用户
应该具有控制向终端上写信息的能力。大部分主机允许用户接受或者拒绝类
似的信息。
  下面三个命令被定义来支持获得信件。它们被用于邮件命令而不是MAIL
命令,指示接收SMTP这种操作的特殊意义:
  SEND <SP> FROM:<reverse-path> <CRLF>

  SEND命令要求邮件内容直接传送到用户终端。如果用户未打开终端(或
者未接收终端信息),450响应将返回一个RCPT命令。如果信息被成功发送,
此操作成功。 

  SOML <SP> FROM:<reverse-path> <CRLF> 

  Send或者MaiL命令要求将邮件内容直接发送到用户的终端上(如果用户
在终端上)。如果用户不在终端上,邮件内容直接进入邮箱。如果邮件被发送
到用户终端或者用户信箱,发送操作成功。 

  SAML <SP> FROM:<reverse-path> <CRLF>

  Send和MaiL命令要求邮件内容直接发送到用户终端上(如果用户在终端上)。
不管怎么样,信件都会进入信箱。如果信件进入信箱,发送操作成功。
  用于MAIL命令的响应和这些命令的响应相同。  

3.5. 打开和关闭  
  当打开传送通道时,要交换一些信息以确定双方的身份。以下的命令是
用于打开和关闭的:
  HELO <SP> <domain> <CRLF>
  QUIT <CRLF>
  在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

3.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

 3.7. 域  
  域是最近被引入ARPA Internet邮件系统的。使用域可以使地址空间从一
个平面的普通字符串主机名变成全局地址的一个层次结构。主机由一个域名取
代,起始主机是由一系列元串组成,它们由逗号按最特殊到一般的顺序排列。
  例如,"USC-ISIF.ARPA","Fred.Cambridge.UK"和"PC7.LCS.MIT.ARPA"可
能是主机-域标识符。
  无论域名在SMTP中如何使用,只有正式的名称才可以被使用,不可以使用
假名或昵称。

3.8. 改变角色
  TURN命令可以用来改变在传输信道上通信的程序的角色。如果程序A现在是
发送SMTP,它发送TURN命令并接到OK应答(250)后,它就变为接收SMTP了。同
理,程序B也可以从接收SMTP变为发送SMTP。若要拒绝改变角色,接收方可以发
送502作为应答。
  注意:此命令是可选的。在使用TCP的传输信道时,一般不使用此命令。然
而,当建立传输信道的代价比较大时,此命令很有用。例如,此命令可以支持一
般公共交换电话系统作为传输信道。

4. SMTP说明  
4.1. SMTP命令  
4.1.1. 命令语法  
  SMTP命令定义了邮件传输或由用户定义的系统功能。它的命令是由<CRLF>
结束的字符串。而在带有参数的情况下,命令本身由<SP>和参数分开,如果
未带参数可以直接和<CRLF>连接。邮箱的语法格式必须和接收站点的格式一致。
下面讨论SMTP命令和应答。
  发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。回
复路径就是MAIL命令的参数,而转发路径则是RCPT命令的参数,邮件日期是
DATA命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要
求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一
个转发路径缓冲区,一个邮件内容缓冲区。特定的命令产生自己的缓冲区,
或使一个或多个缓冲的内容被清除。

  HELLO (HELO)
  此命令用于向接收SMTP确认发送SMTP。参数域包括发送SMTP的主机名。
接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。引命令和OK响应确
认发送和接收SMTP进入了初始状态,也就是说,没有操作正在执行,所有状态
表和缓冲区已经被子清除。

  MAIL (MAIL)  
  此命令用于开始将邮件发送到一个多个邮箱中。参数域包括回复路径。
返回路径中包括了可选的主机和发送者邮箱列表。当有主机列表时,它是一
个回复路径源,它说明此邮箱是由在表中的主机一一传递发送(第一个主机
是最后一个接收到此邮件的主机)过来的。此表也有作向发送者返回非传递信
号的源路径。因为每个传递主机地址都被加在此表起始处,它就必须使用发送
IPCE而不是接收IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信
息的回复路径可能就是空的。
  此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将
此命令的回复路径信息插入到回复路径缓冲区中。
  RECIPIENT (RCPT)
  此命令用于确定邮件内容的唯一接收者;多个接收者将由多个此命令指定。
转发路径中包括一个可选的主机和一个必须的目的邮箱。当出现主机列表时,
这就是一个源路径,它指明邮件必须向列表中的上一个主机发送。如果接收
SMTP未实现邮件的传递发送,就会返回如未知本地用户(550)的信息给用户。
  当邮件被传递发送时,传递主机必须将自己的名称由转发路径的开始处
移至回复路径的结束处。当邮件最终到达目的地时,接收SMTP将以它的主机邮
件格式自己的名称插入目标邮件中。例如,由传递主机A接收的带有如下参
数的邮件时,
  FROM:<USERX@HOSTY.ARPA>
  TO:<@HOSTA.ARPA,@HOSTB.ARPA:USERC@HOSTD.ARPA>
  将会变成如下形式:
  FROM:<@HOSTA.ARPA:USERX@HOSTY.ARPA>
  TO:<@HOSTB.ARPA:USERC@HOSTD.ARPA>.
  此命令导致它的转发路径参数加入转发路径缓冲区中。

  DATA (DATA)
  接收者将跟在命令后的行作为邮件内容。此命令导致此命令后的邮件内容
加入邮件内容缓冲区。邮件内容可以包括所有128个ASCII码字符。邮件内容由只
包括一个句号的行结束,也就是如下的字符序列:"<CRLF>.<CRLF>",它指示了
邮件的结束。
  邮件内容的结束指示要求接收者现在就处理保存的邮件内容。此过程将回复
路径缓冲区,转发路径缓冲区和邮件内容缓冲区的内容全部清空。如果操作成功,
接收者必须返回OK应答;如果失败也必须返回失败应答。
  当接收SMTP收到一条信息时,无论是用作转发还是此邮件已经到达目的地,
它都必须在邮件内容的开始处加上时间戳这一行,这一行指示了接收到邮件主
机和发出此邮件主机的标识,以及接收到邮件内容的时间和日期。转发的信件
将有多行这样的时间戳。当接收SMTP作最后一站的传送时,它将返回路径信息
行插入邮件中。此行包括了发送命令中的<reverse-path>的信息。在这里,最
后一站的传送的意思是邮件将被送到目的用户手中,但在一些情况下,邮件可
能需要更进一步的加工并由另外的邮件系统传送。
  可能在返回路径中的邮箱与实际发送的邮件不一致,这个情况可能发生在
需要传送一个特定的错误处理信箱而不是信件发送者那里。上面所述说明了,
最后的邮件内容由一个返回路径行,和在其后的一个或多个时间戳行构成。这
些行后面是邮件内容的头和体信息。
  当处理后面的邮件数据指示部分成功时就需要特定的说明。这种情况可能
发生在发送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 ...  


  SEND (SEND)
  此命令用于开始一个发送命令,将邮件发送到一个或多个终端上。参数
域包括了一个回复路径,此命令如果成功就将邮件发送到终端上了。  
  回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,
表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的
(列表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。
因为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接
收IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径
可能就是空的。
  此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将
此命令的回复路径信息插入到回复路径缓冲区中。

  SEND OR MAIL (SOML)
  此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,或者
传送到邮箱中。对于每个接收者,如果接收者终端打开,邮件内容将被传送到
接收者的终端上,否则就送到接收者的邮箱中。参数域包括回复路径,如果成
功地将信息送到终端或邮箱中此命令成功。
  回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表
示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列
表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因
为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收
IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可
能就是空的。
  此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将
此命令的回复路径信息插入到回复路径缓冲区中。

  SEND AND MAIL (SAML)
  此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,并传
送到邮箱中。如果接收者终端打开,邮件内容将被传送到接收者的终端上和接
收者的邮箱中。参数域包括回复路径,如果成功地将信息送到邮箱中此命令成
功。
  回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表
示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列
表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因
为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收
IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可
能就是空的。
  此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将
此命令的回复路径信息插入到回复路径缓冲区中。

  RESET (RSET)
  此命令指示当送邮件操作将被放弃。任何保存的发送者,接收者和邮件内
容应该被抛弃,所有缓冲区和状态表应该被清除,接收方必须返回OK应答。

  VERIFY (VRFY)
  此命令要求接收者确认参数是一个用户。如果这是(已经知道的)用户名,
返回用户的全名和指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮
件内容缓冲区没有影响。

  EXPAND (EXPN)
  此命令要求接收者确认参数指定了一个邮件发送列表,如果是一个邮件发送
列表,就返回表中的成员。如果这是(已经知道的)用户名,返回用户的全名和
指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有
影响。

  HELP (HELP)
  此命令导致接收者向HELP命令的发送者发出帮助信息。此命令可以带参数,
并返回特定的信息作为应答。此命令对回复路径缓冲区,转发路径缓冲区和邮件
内容缓冲区没有影响。

  NOOP (NOOP)  
  此命令不影响任何参数和已经发出的命令。它只是说明没有任何操作而不是
说明接收者发送了一个OK应答。此命令对回复路径缓冲区,转发路径缓冲区和邮
件内容缓冲区没有影响。

  QUIT (QUIT)
  此命令指示接收方必须发送OK应答然后关闭传送信道。接收方在接到QUIT命
令并做出响应之前不应该关闭通信信道。发送方在发送QUIT命令和接收到响应之
前也不应该关闭信道。即使出错,也不应该关闭信道。如果连接被提前关闭,接
收方应该象接收到RSET命令一样,取消所有等待的操作,但不恢复原先已经做过
的操作。而发送方应该象接收到暂时错误(4XX)一样假定命令和操作仍在支持
之中。

  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必须保持在与刚才一致的状态下。
会话的最后一个命令必须是QUIT命令。此命令在会话的其它时间不能使用。