SMTP服务对命令流水的扩展
http://tech.ddvip.com 2006年11月14日 社区交流 收藏本文
本文详细介绍SMTP服务对命令流水的扩展
客户SMTP必须检查与组中据有相关的状态。如果RCPTTP接收地址未被接受,客户端必须检查DATA的状态,客户端不能假设因为没有RCPTTO是成功的所以DATA就会失败。如果DATA命令被正确拒绝,客户端可以发出RSET,如果DATA命令没有被正确拒绝,客户端要发出一个点(dot)。命令所产生的状态必须和分别发出每个命令时相同,必须支持多行(Multiline)响应。客户SMTP可以选择在非阻塞状态运行,它在接收到服务器的响应时立即处理,即使还有数据需要发送也不能推迟对响应的处理。如果不支持非阻塞状态,客户端必须检查TCP窗口的大小,TCP窗口的大小必须大于命令组的大小。窗口大小经常是4K,如果不能进行这样的检查,可能会导致死锁。
4.2.服务器对流水的支持
服务器应该提供下面的服务扩展:
在任何情况下不行将TCP输入缓冲区的内容丢弃;
当且仅当接收到一个或多个有效的RCPTTO命令时,才对DATA命令应该主动发出响应;
因为DATA命令没有合法的接收者,结果接收到空信息时,不要再发出消息给任何人(当然对DATA命令还要做一个响应);
对成组的RSET,MAILFROM,SENDFROM,SOMLFROM,SAMLFROM和RCPTTO命令的响应先保存起来,然后一起发送;
不允许缓存对EHLO,DATA,VRFY,EXPN,TURN,QUIT和NOOP的响应;
不允许缓冲不可识别命令的响应;
在本地TCP输入缓冲区为空时必须将据有未发出的响应全部发出;
不允许对未接收到的命令进行猜测;或假设它的存在;
在响应的文本信息中应该表时这是对哪个命令进行的响应;
5.例子
下面是一个不支持流水的SMTP会话:其中S代表服务器,C代表客户端;
S:<等待打开连接>
C:<打开连接>
责编:豆豆技术应用