smtp协议,如何判断邮件已经成功发送?

smtp协议,如何判断邮件已经成功发送?

不熟悉邮件系统,但忍不住好奇查查资料。

第一个问题,按 smtp 的设计,当服务端给了你最后的 250 响应后就表示邮件一定会发送(尽管也未必成功),最后的 QUIT 是无所谓的,所以你客户端可以假定发送成功。

具体参考 smtp 协议说明 rfc5321

https://www.rfc-editor.org/rfc/rfc5321#page-71

而如果是 QUIT 之前通信超时,那确实难以判定是否成功“发送”。针对这个问题,文档给的答案是让服务端响应快一点。啊~ 真敷衍……

第二个问题,参考以上,如果因未收到 QUIT 就重试,那确实会重复。如果因未收到 250 就重试,看情况也可能重复。而那份 rfc 里似乎对这事“见怪不怪”的语气……

至于怎么避免邮件重复发送,也许还有什么 smtp 协议补丁能实现吧。比如用 “发件人 + 时间戳 + 邮件内容 hash”构成 UID 来保证一定时间内“恰好一次”投递,但这只是我乱想的,光靠客户端无法实现。考虑到当下公网通信质量还不错,以及邮件重复的后果比较轻,也许重试是可以接受的。

以上,个人愚见,仅供参考。