SMTP服务扩展( 二 )


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


推荐阅读