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命令。此命令在会话的其它时间不能使用。
4.1.2. command语法格式
命令是由命令码和其后的参数域组成的。命令码是四个字母组成的,不区别大小写。因为下面的命令的作用是相同的:
mail mail mail mail mail
这对于引导任何参数值的标记也是适用的,如to和to就是一样的。命令码和参数由一个或多个空格分开。然而在回复路径和转发路径中的参数是区别大小写的。特别是在一些主机上,"smith"和"smith"就根本不是一个用户。
参数域由不定长的字符串组成,它由<crlf>结束,接收方在完全接收到此序列前不会采取任何行动。方括号代表可选的参数域。如果不选择的话,系统选择默认的设置。
下面是smtp命令: helo <sp> <domain> <crlf> mail <sp> from:<reverse-path> <crlf>
rcpt <sp> to:<forward-path> <crlf>
data <crlf>
rset <crlf>
send <sp> from:<reverse-path> <crlf>
soml <sp> from:<reverse-path> <crlf>
saml <sp> from:<reverse-path> <crlf>
vrfy <sp> <string> <crlf>
expn <sp> <string> <crlf>
help [<sp> <string>] <crlf>
noop <crlf>
quit <crlf>
turn <crlf>
上面参数域的格式在下面给bnf的格式给出,其中的"..."代表对于一个域的一次或多次的重复。
<reverse-path> ::= <path>
<forward-path> ::= <path>
<path> ::= "<" [ <a-d-l> ":" ] <mailbox> ">"
<a-d-l> ::= <at-domain> | <at-domain> "," <a-d-l>
<at-domain> ::= "@" <domain>
<domain> ::= <element> | <element> "." <domain>
<element> ::= <name> | "#" <number> | "[" <dotnum> "]"
<mailbox> ::= <local-part> "@" <domain>
<local-part> ::= <dot-string> | <quoted-string>
<name> ::= <a> <ldh-str> <let-dig>
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig> ::= <a> | <d>
<let-dig-hyp> ::= <a> | <d> | "-"
<dot-string> ::= <字符串> | <字符串> "." <dot-string>
<字符串> ::= <字符> | <字符> <字符串>
<quoted-string> ::= """ <qtext> """
<qtext> ::= "\" <x> | "\" <x> <qtext> | <q> | <q> <qtext>
<字符> ::= <c> | "\" <x>
<dotnum> ::= <snum> "." <snum> "." <snum> "." <snum>
<number> ::= <d> | <d> <number>
<crlf> ::= <cr> <lf>
<cr> ::= 回车符(ascii码13) <lf> ::= (ascii码10)