3.4. 发送信件(mailing)和获得信件(sending) <br>
SMTP的主要目的是将邮件发送到用户的邮箱中。由一些主机提供的类似 <br>
的功能是把邮件送至用户的终端(如果用户正打开终端)。将邮件送到用户 <br>
的邮箱中称为发送信件(mailing);而送至用户终端则称之为获得信件 <br>
(sending)。因为在一些主机上,这两者的实现十分类似,所以它们同时 <br>
被放入了SMTP中。然而,获得信件命令在SMTP的最小实现中是没有的。用户 <br>
应该具有控制向终端上写信息的能力。大部分主机允许用户接受或者拒绝类 <br>
似的信息。 <br>
下面三个命令被定义来支持获得信件。它们被用于邮件命令而不是MAIL <br>
命令,指示接收SMTP这种操作的特殊意义: <br>
SEND <SP> FROM:<reverse-path> <CRLF> <br>
<br>
SEND命令要求邮件内容直接传送到用户终端。如果用户未打开终端(或 <br>
者未接收终端信息),450响应将返回一个RCPT命令。如果信息被成功发送, <br>
此操作成功。 <br>
<br>
SOML <SP> FROM:<reverse-path> <CRLF> <br>
<br>
Send或者MaiL命令要求将邮件内容直接发送到用户的终端上(如果用户 <br>
在终端上)。如果用户不在终端上,邮件内容直接进入邮箱。如果邮件被发送 <br>
到用户终端或者用户信箱,发送操作成功。 <br>
<br>
SAML <SP> FROM:<reverse-path> <CRLF> <br>
<br>
Send和MaiL命令要求邮件内容直接发送到用户终端上(如果用户在终端上)。 <br>
不管怎么样,信件都会进入信箱。如果信件进入信箱,发送操作成功。 <br>
用于MAIL命令的响应和这些命令的响应相同。 <br>
<br>
3.5. 打开和关闭 <br>
当打开传送通道时,要交换一些信息以确定双方的身份。以下的命令是 <br>
用于打开和关闭的: <br>
HELO <SP> <domain> <CRLF> <br>
QUIT <CRLF> <br>
在HELLO命令中,主机自己发送命令,此命令可以被解释为:“你好, <br>
我是XX”。 <br>
<br>
打开联结的例子 <br>
R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready <br>
S: HELO USC-ISIF.ARPA <br>
R: 250 BBN-UNIX.ARPA <br>
<br>
关闭联结的例子 <br>
S: QUIT <br>
R: 221 BBN-UNIX.ARPA Service closing transmission channel <br>
<br>
3.6. 转发 <br>
转发路径可能是如下格式:"@ONE,@TWO:JOE@THREE",在这里,ONE,TWO <br>
和THREE是主机。这种格式用于强调地址和路径的区别。邮箱是绝对地址,路 <br>
径是关于如何到达的信息。这两个概念不应该被混淆。 <br>
概念上,转发路径的元素被移动到回复路径作为从一个SMTP服务器到另一 <br>
个SMTP服务器的信息。回复路径是一个反向数据源路径,例如从当前信息的位 <br>
置到发起者的位置。当一个SMTP服务器从转发路径中删除自己的标记并将它插 <br>
入到回复路径中时,它必须使用它发送环境能够理解的名称来进行,以防它的 <br>
名称在不同的环境中被理解为不同的名字。 <br>
如果当SMTP接收到信息的转发路径的第一个元素不是此SMTP的标记时,此 <br>
元素不从转发路径中删除,而被用来决定下一个应该发送到的SMTP服务器。在 <br>
任何情况下,SMTP都将自己的标记加入反向路径中。 <br>
使用源路径时,接收SMTP接收转发的邮件并发送到另一接收SMTP服务器上。 <br>
接收服务器可以接受或拒绝转发本地用户的邮件。接收SMTP通过将它自己的标记 <br>
从转发路径移至回复路径的开始处来改变命令参数。这时,接收SMTP变成了发 <br>
送SMTP,也就建立了到下一个转发路径中SMTP的通道,然后,它向这个SMTP发 <br>
送邮件。 <br>
在回复路径上的头一个主机应是发送SMTP命令的主机,在转发路径上第一个 <br>
主机应是接收SMTP命令的主机。 <br>
注意:转发路径和回复路径出现在SMTP命令和应答中,但不一定要出现在信 <br>
息中。也就是说,没有必须要这样的路径特别这种格式出现在信息头的"To:", <br>
"From:"和"CC:"等域中。 <br>
如果SMTP服务器接受了转发任务,但后来它发现因为转发路径不正确或者 <br>
其它原理无法发送邮件,它必须建立一"undeliverable mail"信号,将它此信号 <br>
送到此信的发主者那里。 <br>
此信号必须是从此主机的SMTP服务上发出的,当然了,此服务器不应该再报 <br>
告出错信息的错误。一种阻止这种出错报告循环的情况是在信号的邮件命令的回 <br>
复路径上置空。在传送此信息时,允许将回复路径也置为空。一个MAIL命令后的 <br>
回复路径为空表现为如下形式: <br>
MAIL FROM:<> <br>
<br>
下例中显示了不可传送的邮件信息。此信息是对从HOSTW上的JOE发出的邮件 <br>
经过在HOSTX需要经过HOSTZ到达HOSTY时出错的回应。我们看到的例子是在HOSTX <br>
和HOSTY之间发生的。 <br>
<br>
不可传送邮件信息的例子 <br>
S: MAIL FROM:<> <br>
R: 250 ok <br>
S: RCPT TO:<@HOSTX.ARPA:JOE@HOSTW.ARPA> <br>
R: 250 ok <br>
S: DATA <br>
R: 354 send the mail data, end with . <br>
S: Date: 23 Oct 81 11:22:33 <br>
S: From: SMTP@HOSTY.ARPA <br>
S: To: JOE@HOSTW.ARPA <br>
S: Subject: Mail System Problem <br>
S: <br>
S: Sorry JOE, your message to SAM@HOSTZ.ARPA lost. <br>
S: HOSTZ.ARPA said this: <br>
S: "550 No Such User" <br>
S: . <br>
R: 250 ok <br>
<br>
3.7. 域 <br>
域是最近被引入ARPA Internet邮件系统的。使用域可以使地址空间从一 <br>
个平面的普通字符串主机名变成全局地址的一个层次结构。主机由一个域名取 <br>
代,起始主机是由一系列元串组成,它们由逗号按最特殊到一般的顺序排列。 <br>
例如,"USC-ISIF.ARPA","Fred.Cambridge.UK"和"PC7.LCS.MIT.ARPA"可 <br>
能是主机-域标识符。 <br>
无论域名在SMTP中如何使用,只有正式的名称才可以被使用,不可以使用 <br>
假名或昵称。 <br>
<br>
3.8. 改变角色 <br>
TURN命令可以用来改变在传输信道上通信的程序的角色。如果程序A现在是 <br>
发送SMTP,它发送TURN命令并接到OK应答(250)后,它就变为接收SMTP了。同 <br>
理,程序B也可以从接收SMTP变为发送SMTP。若要拒绝改变角色,接收方可以发 <br>
送502作为应答。 <br>
注意:此命令是可选的。在使用TCP的传输信道时,一般不使用此命令。然 <br>
而,当建立传输信道的代价比较大时,此命令很有用。例如,此命令可以支持一 <br>
般公共交换电话系统作为传输信道。 <br>
<br>
4. SMTP说明 <br>
4.1. SMTP命令 <br>
4.1.1. 命令语法 <br>
SMTP命令定义了邮件传输或由用户定义的系统功能。它的命令是由<CRLF> <br>
结束的字符串。而在带有参数的情况下,命令本身由<SP>和参数分开,如果 <br>
未带参数可以直接和<CRLF>连接。邮箱的语法格式必须和接收站点的格式一致。 <br>
下面讨论SMTP命令和应答。 <br>
发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。回 <br>
复路径就是MAIL命令的参数,而转发路径则是RCPT命令的参数,邮件日期是 <br>
DATA命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要 <br>
求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一 <br>
个转发路径缓冲区,一个邮件内容缓冲区。特定的命令产生自己的缓冲区, <br>
或使一个或多个缓冲的内容被清除。 <br>
<br>
HELLO (HELO) <br>
此命令用于向接收SMTP确认发送SMTP。参数域包括发送SMTP的主机名。 <br>
接收SMTP通过连接确认命令来向发送SMTP确认接收SMTP。引命令和OK响应确 <br>
认发送和接收SMTP进入了初始状态,也就是说,没有操作正在执行,所有状态 <br>
表和缓冲区已经被子清除。 <br>
<br>
MAIL (MAIL) <br>
此命令用于开始将邮件发送到一个多个邮箱中。参数域包括回复路径。 <br>
返回路径中包括了可选的主机和发送者邮箱列表。当有主机列表时,它是一 <br>
个回复路径源,它说明此邮箱是由在表中的主机一一传递发送(第一个主机 <br>
是最后一个接收到此邮件的主机)过来的。此表也有作向发送者返回非传递信 <br>
号的源路径。因为每个传递主机地址都被加在此表起始处,它就必须使用发送 <br>
IPCE而不是接收IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信 <br>
息的回复路径可能就是空的。 <br>
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将 <br>
此命令的回复路径信息插入到回复路径缓冲区中。 <br>
RECIPIENT (RCPT) <br>
此命令用于确定邮件内容的唯一接收者;多个接收者将由多个此命令指定。 <br>
转发路径中包括一个可选的主机和一个必须的目的邮箱。当出现主机列表时, <br>
这就是一个源路径,它指明邮件必须向列表中的上一个主机发送。如果接收 <br>
SMTP未实现邮件的传递发送,就会返回如未知本地用户(550)的信息给用户。 <br>
当邮件被传递发送时,传递主机必须将自己的名称由转发路径的开始处 <br>
移至回复路径的结束处。当邮件最终到达目的地时,接收SMTP将以它的主机邮 <br>
件格式自己的名称插入目标邮件中。例如,由传递主机A接收的带有如下参 <br>
数的邮件时, <br>
FROM:<USERX@HOSTY.ARPA> <br>
TO:<@HOSTA.ARPA,@HOSTB.ARPA:USERC@HOSTD.ARPA> <br>
将会变成如下形式: <br>
FROM:<@HOSTA.ARPA:USERX@HOSTY.ARPA> <br>
TO:<@HOSTB.ARPA:USERC@HOSTD.ARPA>. <br>
此命令导致它的转发路径参数加入转发路径缓冲区中。 <br>
<br>
DATA (DATA) <br>
接收者将跟在命令后的行作为邮件内容。此命令导致此命令后的邮件内容 <br>
加入邮件内容缓冲区。邮件内容可以包括所有128个ASCII码字符。邮件内容由只 <br>
包括一个句号的行结束,也就是如下的字符序列:"<CRLF>.<CRLF>",它指示了 <br>
邮件的结束。 <br>
邮件内容的结束指示要求接收者现在就处理保存的邮件内容。此过程将回复 <br>
路径缓冲区,转发路径缓冲区和邮件内容缓冲区的内容全部清空。如果操作成功, <br>
接收者必须返回OK应答;如果失败也必须返回失败应答。 <br>
当接收SMTP收到一条信息时,无论是用作转发还是此邮件已经到达目的地, <br>
它都必须在邮件内容的开始处加上时间戳这一行,这一行指示了接收到邮件主 <br>
机和发出此邮件主机的标识,以及接收到邮件内容的时间和日期。转发的信件 <br>
将有多行这样的时间戳。当接收SMTP作最后一站的传送时,它将返回路径信息 <br>
行插入邮件中。此行包括了发送命令中的<reverse-path>的信息。在这里,最 <br>
后一站的传送的意思是邮件将被送到目的用户手中,但在一些情况下,邮件可 <br>
能需要更进一步的加工并由另外的邮件系统传送。 <br>
可能在返回路径中的邮箱与实际发送的邮件不一致,这个情况可能发生在 <br>
需要传送一个特定的错误处理信箱而不是信件发送者那里。上面所述说明了, <br>
最后的邮件内容由一个返回路径行,和在其后的一个或多个时间戳行构成。这 <br>
些行后面是邮件内容的头和体信息。 <br>
当处理后面的邮件数据指示部分成功时就需要特定的说明。这种情况可能 <br>
发生在发送SMTP发现当邮件需要传送给多个用户时,只能够成功地向其中的一 <br>
部分发送信息这种情况下。在这种情况下,必须对DATA命令发送OK应答,而接 <br>
收SMTP组织并发送一个"不可传递邮件"信息到信息的发送者。在此信息中或者 <br>
发送一个不成功接收者的列表,或者每次发送一个不成接收者,而发送多次。 <br>
所有不可传递邮件信息由MAIL命令发送。 <br>
<br>
返回路径和接收时间戳例子 <br>
Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:JOE@ABC.ARPA> <br>
Received: from GHI.ARPA by JKL.ARPA ; 27 Oct 81 15:27:39 PST <br>
Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST <br>
Received: from ABC.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST <br>
Date: 27 Oct 81 15:01:01 PST <br>
From: JOE@ABC.ARPA <br>
Subject: Improved Mailing System Installed <br>
To: SAM@JKL.ARPA <br>
<br>
This is to inform you that ... <br>
<br>
<br>
SEND (SEND) <br>
此命令用于开始一个发送命令,将邮件发送到一个或多个终端上。参数 <br>
域包括了一个回复路径,此命令如果成功就将邮件发送到终端上了。 <br>
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时, <br>
表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的 <br>
(列表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。 <br>
因为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接 <br>
收IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径 <br>
可能就是空的。 <br>
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将 <br>
此命令的回复路径信息插入到回复路径缓冲区中。 <br>
<br>
SEND OR MAIL (SOML) <br>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,或者 <br>
传送到邮箱中。对于每个接收者,如果接收者终端打开,邮件内容将被传送到 <br>
接收者的终端上,否则就送到接收者的邮箱中。参数域包括回复路径,如果成 <br>
功地将信息送到终端或邮箱中此命令成功。 <br>
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表 <br>
示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列 <br>
表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因 <br>
为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收 <br>
IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可 <br>
能就是空的。 <br>
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将 <br>
此命令的回复路径信息插入到回复路径缓冲区中。 <br>
<br>
SEND AND MAIL (SAML) <br>
此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,并传 <br>
送到邮箱中。如果接收者终端打开,邮件内容将被传送到接收者的终端上和接 <br>
收者的邮箱中。参数域包括回复路径,如果成功地将信息送到邮箱中此命令成 <br>
功。 <br>
回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表 <br>
示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列 <br>
表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因 <br>
为每个传递主机地址都被加在此表起始处,它就必须使用发送IPCE而不是接收 <br>
IPCE(如果它们不是一个IPCE的话)清楚的名称。一些出错信息的回复路径可 <br>
能就是空的。 <br>
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将 <br>
此命令的回复路径信息插入到回复路径缓冲区中。 <br>
<br>
RESET (RSET) <br>
此命令指示当送邮件操作将被放弃。任何保存的发送者,接收者和邮件内 <br>
容应该被抛弃,所有缓冲区和状态表应该被清除,接收方必须返回OK应答。 <br>
<br>
VERIFY (VRFY) <br>
此命令要求接收者确认参数是一个用户。如果这是(已经知道的)用户名, <br>
返回用户的全名和指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮 <br>
件内容缓冲区没有影响。 <br>
<br>
EXPAND (EXPN) <br>
此命令要求接收者确认参数指定了一个邮件发送列表,如果是一个邮件发送 <br>
列表,就返回表中的成员。如果这是(已经知道的)用户名,返回用户的全名和 <br>
指定的邮箱。此命令对回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区没有 <br>
影响。 <br>
<br>
HELP (HELP) <br>
此命令导致接收者向HELP命令的发送者发出帮助信息。此命令可以带参数, <br>
并返回特定的信息作为应答。此命令对回复路径缓冲区,转发路径缓冲区和邮件 <br>
内容缓冲区没有影响。 <br>
<br>
NOOP (NOOP) <br>
此命令不影响任何参数和已经发出的命令。它只是说明没有任何操作而不是 <br>
说明接收者发送了一个OK应答。此命令对回复路径缓冲区,转发路径缓冲区和邮 <br>
件内容缓冲区没有影响。 <br>
<br>
QUIT (QUIT) <br>
此命令指示接收方必须发送OK应答然后关闭传送信道。接收方在接到QUIT命 <br>
令并做出响应之前不应该关闭通信信道。发送方在发送QUIT命令和接收到响应之 <br>
前也不应该关闭信道。即使出错,也不应该关闭信道。如果连接被提前关闭,接 <br>
收方应该象接收到RSET命令一样,取消所有等待的操作,但不恢复原先已经做过 <br>
的操作。而发送方应该象接收到暂时错误(4XX)一样假定命令和操作仍在支持 <br>
之中。 <br>
<br>
TURN (TURN) <br>
此命令指定接收方要么发送OK应答并改变角色为发送SMTP,要么发送拒绝信 <br>
息并保持自己的角色。如果程序A现在是发送SMTP,它发出TURN命令后接收到 <br>
OK(250)应答,它就变成了接收SMTP。程序A就进入初始状态,好象通信信道刚 <br>
打开一样,这时它发送220准备好服务信号。如果程序B现在是接收SMTP,它发 <br>
出TURN命令后接收到OK(250)应答,它就变成了发送SMTP。程序A就进入初始状 <br>
态,好象通信信道刚打开一样,这时它准备接收220准备好服务信号。 <br>
若要拒绝改变角色,接收方可以发送502应答。 <br>
对于这些命令的顺序有一定的限制。对话的第一个命令必须是HELLO命令, <br>
此命令在此后的会话中也可以使用。如果HELLO命令的参数不可接受,必须由返 <br>
回一个501失败应答,同时接收到的SMTP必须保持在与刚才一致的状态下。 <br>
NOOP,HELP,EXPN和VRFY命令可以在会话的任何时候使用。MAIL,SEND,SOML或 <br>
SAML命令开始一个邮件操作。一旦开始了以后就要发送RCPT和DATA命令。邮件操 <br>
作可以由RSET命令终止。在一个会话中可以有一个或多个操作。 <br>
如果在操作开始参数不可接受,必须返回501失败应答,同时接收到的SMTP <br>
必须保持在与刚才一致的状态下。如果操作中的命令顺序出错,必须返回503失 <br>
败应答,同时接收到的SMTP必须保持在与刚才一致的状态下。 <br>
会话的最后一个命令必须是QUIT命令。此命令在会话的其它时间不能使用。<br>
|