SMTP服务扩展(2)
来源:asp之家 时间:2010-03-16 18:48:00
如果出于某种原因,服务器不能列出它所支持的服务扩展,就返回代码554。在接收到这个代码后,客户要么发送HELO,要么发送QUIT命令。有时候服务器接收到EHLO命令,可是命令参数不可接受,它就返回代码501。如果服务器识别了EHLO,但对服务器扩展未实现,则返回代码502。如果服务器不再提供服务扩展,则返回代码421。在接收到这个代码后,客户要么发送HELO,要么发送QUIT命令。如果服务器不支持服务扩展,则返回500,服务器保持现有状态,在接收到这个代码后,客户要么发送HELO,要么发送QUIT命令。
有时候,SMTP服务器会在接收到EHLO命令后因为某种原因关闭连接,这种情况在原来的SMTP协议标准中未涉及。为了处理这种情况,客户必须能够确认服务器是否能够工作,它可以重新连接并发送HELO或EHLO命令。有些服务器在接收到一个EHLO命令后会拒绝接收新的HELO命令,这时可以利用RSET命令重新启动,然后再发送HELO。如果客户不注意这样的小细节,会收到失败代码。
下面我们来看一下MAIL FROM和RCPT TO参数。许多服务扩展是在MAIL FROM和RCPT TO命令后加入一些参数来实现的。下面我们看一下这两个命令的格式:
esmtp-cmd ::= inner-esmtp-cmd [SP esmtp-parameters] CR LF
esmtp-parameters ::= esmtp-parameter *(SP esmtp-parameter)
esmtp-parameter ::= esmtp-keyword ["=" esmtp-value]
esmtp-keyword ::= (字母/数字) *(字母/数字/"-")
esmtp-value ::= 1*<除了空格,"="和控制字符的所有字符>
inner-esmtp-cmd ::= ("MAIL FROM:"返回路径) / ("RCPT TO:"转发路径)
如果服务器不能识别或实现一个或多个MAIL FROM或RCPT TO参数,它应该返回代码555。如果这种情况只是暂时的,服务器返回代码455。其它返回代码请查阅相关资料,这里不再详述了。服务器以服务扩展处理时,它处理的任何信息都应该在包头上加上“服务扩展标记”以示区别。
下面是一个例子:
(1) 双方交互:S是服务器,C是客户。
S: <等待连接在TCP端口25>
C: <连接到服务器>
S: 220 dbc.mtview.ca.us SMTP service ready
C: EHLO ymir.claremont.edu
S: 250 dbc.mtview.ca.us says hello
...
(2) 下面也是一个例子:
S: <等待连接在TCP端口25>
C: <连接到服务器>
S: 220 dbc.mtview.ca.us SMTP service ready
C: EHLO ymir.claremont.edu
S: 250-dbc.mtview.ca.us says hello
S: 250-EXPN
S: 250-HELP
S: 250-8BITMIME
S: 250-XONE
S: 250 XVRB
...
这说明服务器实现了服务扩展EXPN和HELP,这两个是标准的服务扩展,另外两个以X开头的是非标准的。
(3) 最后,我们来看看服务器不支持服务扩展时的情况:
S: <等待连接在TCP端口25>
C: <连接到服务器>
S: 220 dbc.mtview.ca.us SMTP service ready
C: EHLO ymir.claremont.edu
S: 500 Command not recognized: EHLO
...
代码500表示服务器不支持服务扩展。