Files
tamakyi 5823b5fbb3 SMTP 断线自动重连:修掉大 delay 下整批 please run connect() first
现象:--delay 调到 60s/封、发 305 人时,第一封报 Server not connected,
之后每一封都是 please run connect() first,全军覆没。

根因:SMTP 服务器会掐掉空闲连接(QQ/163/阿里云常见 5~15 分钟,有的更短)。
脚本只在开头 smtp_login 一次,之后从不重连——连接一旦被服务器关掉,
同一个死掉的连接对象会被反复使用,除第一封外全是 connect() 报错。
delay 越大必然越早触发;以前默认 1s/封时几乎等不到超时,所以没暴露过。

改动:
- 新增 SmtpSession 包装连接:
  * 空闲超过 smtp_idle_reconnect 秒(默认 30,可 0 关闭)就主动断开重连,
    不必每封都先吃一发失败
  * 仍遇到断线类异常(ServerDisconnected/ConnectError/OSError)立即重连
    重试,最多 3 次(间隔 2s/4s);耗尽后抛原始异常、该收件人如实计失败
  * 只重试连接类异常;SMTP 拒收(5xx/4xx 回话)不重试,避免重复投递
  * 「Server not connected」不会被误判为限流,不会误触发发送中止
- 新增 --smtp-idle-reconnect / params.ini [send] smtp_idle_reconnect
- 发送循环改用 SmtpSession,结束统一 close
2026-09-07 20:14:34 +08:00

53 lines
1.9 KiB
INI
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; broadcast.py 参数文件:每次运行自动读取;命令行参数优先级更高
; 注意:本文件不控制 --send/--yes,正式发送仍需命令行显式指定
[path]
; conf/app.ini 路径(相对路径按运行脚本时的当前目录解析)
config = ../auto/conf/app.ini
[site]
site_url = https://box.shiroko.one
box_prefix = /_/
; 自定义占位符:模板里用 {{键名}} 引用
[vars]
expire_date = 2026-12-24
old_domain = box.tama.guru
[send]
; to = 可选:默认测试收件邮箱(正式群发用命令行 --send,不加 --to
delay = 1.0
group_pause = 3.0
; SMTP 连接空闲超过该秒数就主动重连再发。
; delay 调大时(比如 60s/封)服务器会掐掉空闲连接,出现整批
; 「please run connect() first」;保持默认 30 即可自动重连,设 0 关闭
smtp_idle_reconnect = 30
; 退信核查 / 发送中限流巡检开关
; 这些都能在 params.ini 里长期配置,命令行同名参数可临时覆盖
[bounce]
; 发送中巡检收件箱:出现「外发频率超过邮件系统限制」类限流退信立即中止发送
; 中止后会把限流地址从断点清单剔除,等限制恢复重跑即自动补发
watch_bounces = 1
; 每发 N 封巡检一次退信。调小更及时,但 IMAP 登录更频繁(不建议 < 5)
watch_every = 10
; 退信核查时,分类不明的退信是否也按「可重试」一并剔除补发(默认 0,保守不补发)
prune_unknown = 0
; 停用无效地址清单:既不跳过已知无效地址,也不写入新的硬退信
no_invalid_list = 0
; 留空则用脚本同目录的默认文件名
invalid_file =
bounce_report =
; IMAP(退信核查要用发件邮箱的 IMAP;留空则按 SMTP 域名推导 smtp.xxx → imap.xxx
imap_host =
imap_port = 993
; since = auto 表示从断点清单最早一条发送记录的时间开始扫描,只查本次群发的退信
since = auto
since_days = 3