我在 Centos 服务器上使用 Sendmail 发送 PHP 脚本的电子邮件,但问题是邮件被传递到机器上的本地邮箱,而不是域的 MX 记录中指定的邮箱 - 后者实际上指向我用于电子邮件的另一台机器。
我希望 sendmail 不会尝试在本地向机器设置的域传递邮件,有没有简单的方法可以禁用本地传递?
该域不在本地主机名文件中。
我已经进行了大量谷歌搜索,并且查看了:
但要么没有答案,要么不适合。
我不想中继到另一台服务器,我只是希望它能够发送邮件,而不管域名是什么。
举个例子:
我有两台服务器,一台是 mail.example.com 的邮件服务器,另一台是 example.com 的 Web 服务器,当我在 Web 服务器上使用 smtp 服务时,它当前将邮件路由到 example.com 上的本地邮箱,但它应该发送到 mail.example.com 上的邮箱
sendmail -bt 的输出返回:
地址测试模式(规则集 3 不会自动调用) 进入 > 3,0[电子邮件保护] canonify 输入:info@example.com Canonify2 输入:信息 Canonify2 返回:信息 canonify 返回:信息 解析输入:信息 Parse0输入:信息 Parse0 返回:info ParseLocal 输入:信息 ParseLocal 返回:信息 解析1输入:信息 Parse1 返回:$# local $: info 解析返回:$# local $: info
答案1
我禁用本地传送的操作如下。我将使用 example.com 域。
要求:
- example.com 指向分配给其中一个以太网接口的 IP 地址的条目。
- /etc/hosts 定义 example.com,分配给与上面相同的 IP 地址
- 指向 Google 服务器的 example.com MX 记录(ASPMX.L.GOOGLE.COM 等)
- 默认 sendmail 安装(我在 Ubuntu 上)
脚步:
vim /etc/mail/sendmail.mc
在最后:
define(`MAIL_HUB', `example.com.')dnl
define(`LOCAL_RELAY', `example.com.')dnl
进而:
sendmailconfig (or /etc/mail/make depending on your distro)
service sendmail restart
测试:
echo -e "To: [email protected]\nSubject: Test\nTest\n" | sendmail -bm -t -v
echo -e "To: user\nSubject: Test\nTest\n" | sendmail -bm -t -v
您应该会看到它连接到谷歌服务器,然后您应该会看到您的邮件被发送到您的谷歌收件箱。
答案2
感谢 sporker 和 Pawel 为我指明了正确的方向并修复了这个问题。
我最初的问题是 sendmail 将我的域 example.com 电子邮件帐户视为本地帐户。
这些链接非常有用: 发送邮件到本地域忽略 MX 记录(第 2 部分) http://lists.freebsd.org/pipermail/freebsd-questions/2004-September/057382.html http://objectmix.com/sendmail/367920-sendmail-ignores-mailertable-some-semilocal-domains.html
但就我使用 FreeBSD 8.2 的情况而言,真正起作用的是:
# cd /etc/mail
# vim freebsd.mc
添加以下两行:
define(`MAIL_HUB', `example.com.')dnl
define(`LOCAL_RELAY', `example.com.')dnl
就在之前:
MAILER(local)
MAILER(smtp)
# make
--- 这是输出 ---
cp freebsd.mc host.example.com.mc
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 host.example.com.mc > host.example.com.cf
cp freebsd.submit.mc host.example.com.submit.mc
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 host.example.com.submit.mc > host.example.com.submit.cf
--- 输出结束 ---
# cp sendmail.cf sendmail.cf.bak
# cp host.example.com.cf sendmail.cf
# /etc/rc.d/sendmail restart
希望这可以为某些人省去一些麻烦。
答案3
我不是 sendmail 的用户,但我相信 sendmail 会将存储在 中的任何域/etc/mail/local-host-names
视为本地域名。
您可以尝试清空此文件(不要删除它),然后重新启动 sendmail,看看效果如何。
编辑
我提到的文件名实际上已设置sendmail.cf
,而你的可能没有设置为 local-host-names
查找/etc/mail/sendmail.cf
# file containing names of hosts for which we receive email
Fw/etc/mail/local-host-names
这绝不是经过检验的事实,而只是我大声思考而已。
答案4
这可能不是您正在寻找的解决方案,但如果您的问题在于“管理员”或“根”用户收到大量电子邮件和巨大邮箱,您可能需要考虑设置一个 cron 作业来每周、每天等清除邮箱。
我们有几个 CentOS 服务器存在这个问题,但问题是我们希望有时能够阅读邮件,因为它有时可以帮助诊断各种问题。
解决方案是简单地执行 cron 作业并偶尔擦拭盒子。
如果我们发现问题……我们会(暂时)注释掉 cron 作业并阅读日志和电子邮件寻找线索。
只是一个想法...以及一个快速/简单的解决方案。
如果没有,请查看 sendmail.mc 文件并进行相应修改。
快速更新:
这并不完全是你想要的,但可能会给你一些想法,并帮助你阐明一些事情: