我发现,如果主 MX 没有应答,我的 sendmail 配置并不总是会尝试次级 MX 主机。有时会尝试,但更多时候不会。
我想我的问题是:1) sendmail 如何决定何时放弃给定的 MX 并尝试下一个?2) 如何调试正在(未)发生的事情?
为了解决这个问题,我设置了名称 mytest.freefriends.org(我自己的域名),它有一个不可路由的 10.x 主 MX,以及一个良好的辅助 MX:
mytest IN MX 1 nonesuch.freefriends.org.
mytest IN MX 10 goodmx.freefriends.org.
nonesuch IN A 10.10.10.10
在实际情况下,主 MX 是常规主机,可以访问但故意不响应端口 25。显然,一些系统管理员这样做是为了阻止一些从不尝试第二个 MX 的垃圾邮件发送者。(我犹豫是否要公布这样做的域名,但可以私下提供。)我的测试设置得到的结果与实际情况相同 - 有时我的 sendmail 会放弃坏的主 MX 并正确地转向辅助 MX,但更多时候不会。
我在 x86_64 上使用 CentOS 7 分发的 sendmail 8.14.7 二进制文件。我以各种方式定制了 sendmail.cf,但除了超时值之外,似乎没有什么相关的内容,我将在下面附加超时值。
我正在发送测试邮件到,例如[email protected]
。/var/log/maillog 条目只显示 nonesuch 被反复尝试,直到 5 天过去并且被退回:
Mar 15 18:26:45 tug sendmail[26132]: 22FHPiET026128: to=<[email protected]>, delay=00:01:00, xdelay=00:01:00, mailer=esmtp, pri=293911, relay=nonesuch.freefriends.org. [10.10.10.10], dsn=4.0.0, stat=Deferred: Connection timed out with nonesuch.freefriends.org.
我试图辨别真正发生了什么:
rm /tmp/f; sendmail -D/tmp/f -d0-99.99 [email protected]
但大量的 /tmp/f 调试输出仅显示坏的 nonesuch MX 被反复尝试,尽管找到了 goodmx。以下是一小段摘录,显示了给定队列运行的最后一次尝试:
hostsignature(mytest.freefriends.org.) = nonesuch.freefriends.org.:goodmx.freefriends.org.
...
dropenvelope 0x55db2c276ba0: id=<null>, flags=4405046<INQUEUE,NO_BODY_RETN,DELE\
TE_BCC,GLOBALERRS,METOO,IS_MIME,SPLIT>
sendq=0x55db2e364ab0=<[email protected]>:
mailer 4 (esmtp), host `mytest.freefriends.org.'
user `[email protected]', ruser `<null>'
state=QUEUEUP, next=0x0, alias 0x0, uid 0, gid 0
flags=80000182<QPRIMARY,QPINGONFAILURE,QPINGONDELAY,QRCPTOK>
owner=(none), home="(none)", fullname="(none)"
orcpt="(none)", statmta=nonesuch.freefriends.org., status=4.4.1
finalrcpt="RFC822; [email protected]"
rstatus="(none)"
statdate=Tue Mar 15 18:28:59 2022
====finis: stat 75 e_id=NOQUEUE e_flags=4405046<INQUEUE,NO_BODY_RETN,DELETE_BCC,GLOBALERRS,METOO,IS_MIME,SPLIT>
当它返回到辅助服务器时,我无法捕获带有成功消息的日志。有什么方法可以连接到它吗?
我想我可以用 mailertable(或者可能是 bestmx)条目来解决这个问题,但我不知道所有需要它的主机。此外,故障转移到辅助 mx 似乎是一项非常基本的操作(现在),但不起作用。
我在网上、bat 手册、sendmail 源代码(例如 domain.c)等处搜索过,但还没有找到句柄。如果有人想就此事给我发电子邮件,而不是在这里回复,我的地址是 karl (at) freefriends (dot) org。
抱歉留言太长了。提前感谢大家提供的任何线索。
# timeouts (many of these)
#O Timeout.initial=5m
O Timeout.connect=30s
O Timeout.aconnect=30s
O Timeout.iconnect=30s
O Timeout.helo=4m
O Timeout.mail=5m
O Timeout.rcpt=10m
O Timeout.datainit=2m
O Timeout.datablock=6m
O Timeout.datafinal=30m
O Timeout.rset=1m
O Timeout.quit=1m
O Timeout.misc=1m
O Timeout.command=5m
O Timeout.ident=0s
#O Timeout.fileopen=60s
#O Timeout.control=2m
O Timeout.queuereturn=5d
#O Timeout.queuereturn.normal=5d
#O Timeout.queuereturn.urgent=2d
#O Timeout.queuereturn.non-urgent=7d
#O Timeout.queuereturn.dsn=5d
O Timeout.queuewarn=2d
#O Timeout.queuewarn.normal=4h
#O Timeout.queuewarn.urgent=1h
#O Timeout.queuewarn.non-urgent=12h
#O Timeout.queuewarn.dsn=4h
#O Timeout.hoststatus=30m
#O Timeout.resolver.retrans=5s
#O Timeout.resolver.retrans.first=5s
#O Timeout.resolver.retrans.normal=5s
#O Timeout.resolver.retry=4
#O Timeout.resolver.retry.first=4
#O Timeout.resolver.retry.normal=4
O Timeout.lhlo=1m
#O Timeout.auth=10m
O Timeout.starttls=2m