发送中巡检限流退信:发现即中止发送
背景:限流退信是异步投到发件箱的——SMTP 当场返回 250,几十秒后收件箱 才收到「您的账号外发频率超过邮件系统限制」。只等发完再核查,等发现时 被限流的那一批早就全废了,白耗额度。 改动: - 把 IMAP 扫描抽成 _scan_imap_bounces(),供退信核查与发送中巡检共用 (新增 not_before 参数:只看指定时刻之后到达的退信) - 发送过程中每 --watch-every 封(默认 10)巡检一次收件箱,命中限流类 退信立即中止;只看本次运行开始后的新退信,历史退信不误触发 - SMTP 当场返回限流(如 450 MI:CEL)也立即中止;硬退信则照旧记入 无效地址清单并继续发下一封 - 中止后把限流地址从断点清单剔除,等限制恢复重跑即自动补发 - IMAP 连续两轮不可用则自动关闭本次巡检并提示,不影响发送 - 新增 --no-watch-bounces / --watch-every,报告新增 aborted 等字段 - 顺带:分类依据里的状态码改为只显示匹配到的码(原来是整串原文)
This commit is contained in:
@@ -180,6 +180,32 @@ conf/app.ini 路径的解析优先级:
|
||||
- --since 2026-09-07 可显式指定起点日期
|
||||
- 断点清单为空时回退为 --since-days N(默认 3 天)
|
||||
|
||||
发送中限流巡检(边发边看,及时止损)
|
||||
----------------------------------
|
||||
限流退信是**异步**投到发件箱的——SMTP 当场返回 250,几十秒后收件箱才收到
|
||||
「您的账号外发频率超过邮件系统限制」。如果只等发完再核查,等发现时限流那一批
|
||||
早就全废了。所以正式群发时会**边发边巡检收件箱**:
|
||||
|
||||
- 每 `--watch-every` 封(默认 10)登录一次 IMAP 查新退信
|
||||
- 只看**本次运行开始之后**到达的退信,历史退信不会误触发
|
||||
- 一旦出现限流类退信 → 立即停止发送
|
||||
- SMTP 当场就返回限流(如 `450 MI:CEL 发送频率超限`)→ 同样立即停止
|
||||
- 善后:把限流退信的地址从断点清单剔除,等限制恢复后重跑自动补发
|
||||
- 巡检到的「地址不存在」类退信照旧写入无效地址清单
|
||||
|
||||
python3 broadcast.py --send --yes # 默认已开启巡检
|
||||
python3 broadcast.py --send --yes --watch-every 5 # 每 5 封查一次(更及时,IMAP 登录更频繁)
|
||||
python3 broadcast.py --send --yes --no-watch-bounces # 关闭巡检(--to 单封测试本就关闭)
|
||||
|
||||
中止时的输出示例:
|
||||
|
||||
[中止发送] 收件箱出现 1 条限流退信(如 a@b.com:关键词「您的账号外发频率超过邮件系统限制」)
|
||||
[善后] 已将 1 个限流退信地址从断点清单剔除,等限制恢复后重跑同一条命令即可自动补发。
|
||||
发送中止:已成功 30 封,失败 0 封,未发送 30 封。
|
||||
|
||||
注意:巡检依赖 IMAP 可用。若连续两轮连不上 IMAP,会自动关闭本次巡检并提示
|
||||
(不影响发送),此时请发完手动跑一次 `--check-bounces`。
|
||||
|
||||
无效地址清单 broadcast_invalid.json
|
||||
-----------------------------------
|
||||
硬退信(地址不存在等)的地址会写进这里,之后**每次运行都直接跳过**,
|
||||
|
||||
Reference in New Issue
Block a user