我正在尝试实现基于Gevent的SMTP服务器,名为gsmtpd
https://github.com/34nm/gsmtpd
然而,在我的生产服务器登录3周后,我发现大多数网络邮件提供商'客户端在发送所有数据后不会关闭套接字。 引发大量日志表示套接字超时。
我应该在发送所有数据后用Bye关闭套接字吗?
答案 0 :(得分:3)
客户端发送邮件后,您的SMTP服务器应发送250 2.0.0 Ok
以指示邮件已收到。然后,客户端应发送quit
以结束会话,或rset
发送另一条消息。
如果客户端发送quit
,则您的SMTP服务器可以发送221 2.0.0 Bye
并关闭套接字。
如果客户端发送rset
,则您的SMTP服务器可以发送250 2.0.0 Ok
并准备接收另一条消息。
如果客户端发送除quit
或rset
以外的任何内容(或者如果您的SMTP服务器超时等待来自客户端的命令),您的服务器可以发送421 2.0.0 Bye
和关闭插座。
答案 1 :(得分:0)
您应该在收到 quit
后发送 mail
或更多 250
以响应数据的结尾。 rset
和其他允许在 ehlo
之后的命令在这里也允许使用。
在发送数据负载后立即关闭可能会被拒绝,您应该等待 250
响应。这不是一件小事,基本上就是对消息的责任转移。
在收到 250 后关闭连接,但不发送 quit
不会导致任何数据丢失,但可能会浪费服务器上的磁盘,因为它可能会记录这种不规则行为。