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作为应答。