邮件投递的反直觉细节:SMTP 点号转义与队列化
AI 摘要
邮件投递问题源于SMTP点号转义规则,通过调整顺序解决;同时采用队列化提高邮件处理效率和可靠性。
由 AI 生成,仅供参考
给博客加邮件通知的那周,卡在了一个特别离谱的问题上。
注册验证码邮件永远发不出去。SMTP 地址、端口、授权码全对,抓包能看到握手、认证都成功,DATA 命令也发出去了。然后服务器就不回话了,客户端一直等到超时。
对着协议文档逐字读,才发现是点号转义的问题。
SMTP 的 DATA 阶段用一个独占一行的点号表示正文结束。同时协议又要求,正文里凡是行首的点号都要再加一个点转义。这两条规则的执行顺序不能错:
我的代码先写了终止符,再做的转义。结果终止符自己的点号被转成了两个点,服务器就一直等不到结束标记。
把顺序换过来就好了。这种问题靠「看起来没问题」永远查不出来,最后是把写进 socket 的原始字节 dump 出来一行行对。
修好之后顺手把邮件改成了队列。注册、评论通知先进库,请求直接返回,投递放到响应结束之后跑。用户的注册速度再也不看邮件服务器的脸色。
队列表里留着每封邮件的状态和失败原因。出问题的时候,「到底发出去没有」这个问题的答案在数据里,不在感觉里。
评论(0)
登录后才能发表评论。去登录 →
还没有评论,来抢沙发吧~