邮件投递的反直觉细节:SMTP 点号转义与队列化

邮件投递的反直觉细节:SMTP 点号转义与队列化

AI 摘要

邮件投递问题源于SMTP点号转义规则,通过调整顺序解决;同时采用队列化提高邮件处理效率和可靠性。

由 AI 生成,仅供参考

给博客加邮件通知的那周,卡在了一个特别离谱的问题上。

注册验证码邮件永远发不出去。SMTP 地址、端口、授权码全对,抓包能看到握手、认证都成功,DATA 命令也发出去了。然后服务器就不回话了,客户端一直等到超时。

对着协议文档逐字读,才发现是点号转义的问题。

SMTP 的 DATA 阶段用一个独占一行的点号表示正文结束。同时协议又要求,正文里凡是行首的点号都要再加一个点转义。这两条规则的执行顺序不能错:

我的代码先写了终止符,再做的转义。结果终止符自己的点号被转成了两个点,服务器就一直等不到结束标记。

把顺序换过来就好了。这种问题靠「看起来没问题」永远查不出来,最后是把写进 socket 的原始字节 dump 出来一行行对。

修好之后顺手把邮件改成了队列。注册、评论通知先进库,请求直接返回,投递放到响应结束之后跑。用户的注册速度再也不看邮件服务器的脸色。

队列表里留着每封邮件的状态和失败原因。出问题的时候,「到底发出去没有」这个问题的答案在数据里,不在感觉里。

相关文章

分享 微博 X TG .md
字体 字号

评论(0)

登录后才能发表评论。去登录 →

还没有评论,来抢沙发吧~