活动通知把 5 万个地址拼进一个 To 头,网关返回 552 Too many recipients,单封最多允许 100 个。改成分批后单封 50 人,投递才正常。日志里能对上时间点,这种反而好排。

代码里把收件人列表直接拼接进 To,没有分批。SMTP 协议对单封收件人数有上限,超了整封被拒。收件人互相可见,还暴露了地址。这一点先确认清楚,后面就不用反复试。

for i in range(0, len(users), 50):
    chunk = users[i:i+50]
    send_one(bcc=[u["email"] for u in chunk])
    time.sleep(0.5)

围绕「群发未分批」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:按每批 50 人拆分 单独发信;收件人放 Bcc 或者用模板变量逐个发;每批之间留间隔 避免瞬时并发过高;发送前校验地址去重 剔除无效项。

结果对不对很好判断,5 万封全部投递成功,单封收件人数不超过 50,收件人之间看不到彼此地址。

作者 9823189