在 Sendmail 中禁用本地传送

在 Sendmail 中禁用本地传送

我在 Centos 服务器上使用 Sendmail 发送 PHP 脚本的电子邮件,但问题是邮件被传递到机器上的本地邮箱,而不是域的 MX 记录中指定的邮箱 - 后者实际上指向我用于电子邮件的另一台机器。

我希望 sendmail 不会尝试在本地向机器设置的域传递邮件,有没有简单的方法可以禁用本地传递?

该域不在本地主机名文件中。

我已经进行了大量谷歌搜索,并且查看了:

Sendmail 配置不将邮件传递到本地计算机

在 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 文件并进行相应修改。


快速更新:

这并不完全是你想要的,但可能会给你一些想法,并帮助你阐明一些事情:

http://www.pettingers.org/code/sendmail-local.html

相关内容