我已设置sendmail
为监听端口 1234,而不是 25,并进行如下更改sendmail.mc
:
DAEMON_OPTIONS(`Port=1234, Name=MTA')
这通常有效,但有一个例外。背景是我有一个中继在端口 25 上监听(中继必须有 MX 记录,因此它必须在端口 25 上)。中继通过 sendmail 发送邮件,因此 sendmail 监听localhost:1234
。换句话说,sendmail 只负责发送邮件,而不负责接收邮件。/etcnetstat
确认中继在 25 上监听,而 sendmail 在 1234 上监听。
这在以下两个测试用例中有效:
- 我可以通过 telnet 到 sendmail 发送电子邮件(
telnet localhost 1234
) s-nail
我可以通过适当的配置更改发送电子邮件(set mta=smtp://localhost:1234
)
然而,这种设置没有如果我直接运行 sendmail 则可以工作:
sendmail -d8.20 -vt < test-email.txt
在这种情况下,sendmail 尝试通过本地连接到端口 25 来发送邮件,因此它实际上与本地中继进行通信,而不是远程 SMTP 服务器。调试输出显示:
[email protected]... Connecting to [127.0.0.1] via relay...
220 mydomain.org ESMTP mydomain relay
这让我很困惑——知道这是怎么回事吗?
编辑
取得了一些进展。我使用的是 Sendmail 8.15.2、Ubuntu 20.04。这个问题其实并不重要,只是 sendmail 使用每 20 分钟运行一次的 cron 作业刷新其 MSP 队列,因此我收到大量 syslog 故障条目和大量无法送达的电子邮件队列,因为 sendmail 找不到自己。
问题似乎如下。当您使用 sendmail 发送邮件(或管理队列)时,它(通常)是一个 2 步过程。您运行 sendmail,它读取submit.cf
(和不是 sendmail.cf
),并充当 MSA,将邮件提交给某个程序。该程序通常是本地 sendmail 守护程序,它sendmail.cf
在启动时读取邮件。
sendmail.cf
告诉 sendmail 它需要监听localhost:1234
传入邮件。这意味着submit.cf
必须包含一个配置,该配置告诉 sendmail 程序将传出邮件路由到localhost:1234
。
相关submit.mc
配置可能是FEATURE
msp
,默认为
FEATURE(`msp', `[127.0.0.1]', `25')
因此答案可能很简单,只需将 25 改为 1234 即可。然而,这并不容易。只需更改它、重新生成文件并重新启动 sendmail,没有任何区别。事实上,使用submit.cf
或m4
重新生make
成都没有任何区别,或者会给你一个cf
注释掉该功能的文件。有些魔法可以让你更改该功能,但我不知道是什么。答案可能在 /usr/share/sendmail/cf/feature/msp.m4 中,但我看不到它。
答案1
从命令行运行 sendmail,它使用不同的配置文件。
编辑文件“submit.mc”
添加以下行:
define(`RELAY_MAILER_ARGS', `TCP $h 1234')dnl
在该行之前:
FEATURE(`msp', `[127.0.0.1]')dnl
然后将“submit.mc”编译为“submit.cf”。