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
This commit is contained in:
@@ -18,6 +18,10 @@ old_domain = box.tama.guru
|
||||
; 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 里长期配置,命令行同名参数可临时覆盖
|
||||
|
||||
Reference in New Issue
Block a user