for i in range(0, len(mails), 50):
    batch = mails[i:i+50]
    send_batch(batch)
    time.sleep(60)

营销邮件发到第 201 封开始连续退信,返回 421 4.7.0 Too many messages,服务商控制台显示该账号每小时配额 200 封。前一小时发了 380 封,全部进了失败队列。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,发送脚本按收件人循环直连 SMTP,没有做速率控制。服务商按账号小时窗口限流,超出的连接直接被拒。代码把 421 当成永久失败,没有退避重试,整批就废了。

围绕「SMTP 发送限流」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

处理上按这个顺序:把发送速率压到配额以下 用令牌桶控制每分钟封数;遇到 421 按 Retry-After 退避 隔几分钟再发;失败任务进重试队列 不要直接标记失败;监控每小时发送量和退信码分布。

改完只确认一件事:连续两小时发送不再出现 421 退信,失败队列清零,控制台配额使用率稳定在 80% 以下。

作者 9823189