在Sendmail中禁用本地传递


31

我在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 info@example.com
规范输入:info @ example。com
Canonify2输入:信息 
Canonify2返回:信息 
规范回报:信息 
解析输入:信息 
解析0输入:信息 
Parse0返回:信息 
ParseLocal输入:信息 
ParseLocal返回:信息 
Parse1输入:信息 
Parse1返回:$#本地$:信息
解析返回:$#本地$:信息

stalkr.net/forum/… 似乎是最接近我真正追求的东西。特别提到了MAIL_HUB设置,但它似乎实际上不起作用。

请尝试以下操作:sendmail -bt,然后键入3,0 user@domin.com它会给您很多重写规则,最后一个应该给您它将使用的中继。请提供输出。
弗朗索瓦·沃尔玛拉斯2009年

嗨,弗朗索瓦(Francois),我已经编辑了我的问题,以包括输出

Answers:


37

我做了什么来禁用本地传递。我将使用example.com域。

要求:

  • example.com指向分配给eth接口之一的IP地址的条目。
  • 定义example.com的/ etc / hosts分配给与上述相同的IP地址
  • example.com MX记录指向Google服务器(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: user@example.com\nSubject: Test\nTest\n" | sendmail -bm -t -v
echo -e "To: user\nSubject: Test\nTest\n" | sendmail -bm -t -v

您应该看到它正在连接到Google服务器,然后您应该看到邮件已经传递到您的Google收件箱。


3
这个工作非常完美,我只是想知道那里有一个。域名之后。
罗德里戈

完美地工作!
Filipe Pina

谢谢!我一直在尝试修复此问题。我做了以下工作;清除并重新安装sendmail,运行sendmailconfig,添加您指定的行,sendmailconfig再次运行并执行a即可service sendmail restart
Liam Newmarch

@Rodrigo example.com。带有尾点的是标准FQDN。不带点的example.com是相对的,因此不精确,例如,它可能表示example.com.yourdomain.org。取决于您的操作系统设置。这与/etc/passwdetc/passwd
kubanczyk

4

多亏了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

希望这可以减轻某些人的头痛。


1

我不是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    

这绝不是经过检验的事实,而是我大声思考。


是的,这就是为什么我已经提到该域不在本地主机名文件中的原因

抱歉,它将教我回答我未正确阅读的问题。
aussielunix

在一组最近打过补丁的Solaris 10服务器上出现了此问题(打了100个左右的补丁,但只有少数遇到此问题)。解决了!谢谢!
Signal15 2014年

0

这可能不是您要查找的解决方案,但是如果您的问题是“管理员”或“ root”用户收到大量电子邮件和巨大的邮箱,则您可能希望考虑设置cron作业来清除邮箱每周,每天等

我们有几台CentOS服务器都遇到此问题,但问题是我们希望有时能够读取邮件,因为它有时可以帮助诊断各种问题。

解决方案是简单地执行作业并偶尔擦拭盒子。

如果发现问题,我们将暂时淘汰cron作业,并仔细阅读日志和电子邮件以获取线索。

只是一个想法...和一个快速/简单的解决方案。

如果不是,请查看sendmail.mc文件并进行相应的修改。


快速更新:

这并不是您所要的,但可能会给您一些想法并帮助您了解一些事情:

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


抱歉,没有帮助。我要做的就是在本地不发送邮件,为什么sendmail这么难?

0

我个人更像是一个后缀者,但这听起来很像您已配置发送服务器以接收@ yourdomain.com的邮件。如果在postfix中有一个等同于传输机制的sendmail,这就是我用来在服务器之间内部路由邮件的方式。


我没有做太多配置,因为它是centos sendmail安装的默认设置。

0

似乎您的Ruleset 3剥夺了域信息。我在下面提供了一些常规的故障排除步骤。如果这样做不起作用,则必须将sendmail.cf发送给我,以进行查看。

从输出中,example.com被视为本地域。做一个nslookup:

设置q = mx

domain.com

如果这提供了本地计算机的IP地址,则您需要查看您的dns。还要查看/ etc / hosts以确保没有列出domain.com。

它似乎也剥离了@ domain.com,请您尝试使用类似user@stackoverflow.com之类的内容来查看它是否也将其列为本地域。

还要检查sendmail.cf文件中的Cw值。


谢谢弗朗索瓦(Francois),我开始更好地了解sendmail的内部原理。我决定暂时更改机器的主机名以使其能够正常工作,所以现在是www.example.com而不是example.com,这意味着它将为user@www.example.com进行本地交付,但是不是user@example.com-在这个阶段,这对我来说是一个不错的妥协。


0

如果要在尝试传递到本地地址时返回错误,则可以使用访问映射和类似方法:

@your.domain error:nouser 550 No such user here

如果您希望电子邮件被“传递”但被丢弃,则可以安装virtusertable条目,将“ @your.domain”的所有内容都别名为dev-null。保持root本地至少交付“ ” 可能很有用,因为它通常是来自cron作业等的电子邮件报告的接收者。请在您的服务器中尝试以下操作virtusertable

root@your.domain local:root

@your.domain local:dev-null

使用dev-null将消息重定向到/ dev / null 的本地别名,这应该继续传递根电子邮件,但丢弃传递给其他用户的消息。


0

Pawel的修复程序对我有用,但sendosconfig在centos上不存在,因此我必须运行

cd /etc/mail    
m4 /usr/share/sendmail-cf/m4/cf.m4 sendmail.mc > sendmail.cf
service sendmail restart

更新配置


第二个规则在我的
centOS

0

只是确认Pawel的答案解决了我非常相似的问题。

对于使用FreeBSD但又不想过多参与sendmail cf文件工作的人员,以下顺序是您用来在Pawel的示例中添加两行的步骤:

cd /etc/mail
make conf (generates stock .mc/.cf files with the hostname as part of the 
filename - these will NOT be overriten during an upgrade)
vi hostname.mc
(add the two lines to the .mc file right above the last two "MAILER" lines)
make conf
cp hostname.cf sendmail.cf
/etc/rc.d/sendmail restart

0

我遵循了这些建议,并注意到只是增加了pawel提到的步骤,

“ / etc / hosts定义example.com分配给与上面相同的IP地址”,基本上我在/etc/hosts文件中添加了服务器IP,后跟服务器名。

足以让我通过Google路由电子邮件并返回到我的电子邮件。


0

如果使用Cpanel / WHM管理服务器,请确保选择Cpanel / WHM中的“远程邮件交换器”,而不是“自动检测配置”。远程邮件交换器将通过MX记录(包括本地域)发送所有电子邮件。使用自动,本地域电子邮件将直接发送到本地,并且不会发送到MX记录中定义的外部服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.