当邮件服务器不在网络主机上时发送邮件和 MX 记录
Posted
技术标签:
【中文标题】当邮件服务器不在网络主机上时发送邮件和 MX 记录【英文标题】:sendmail and MX records when mail server is not on web host 【发布时间】:2010-09-24 06:32:49 【问题描述】:我确信这是一个很容易解决的问题,但我整天都在努力解决这个问题。
我正在为客户开发一个新网站。该网站位于(这是一个示例)website.com。我有一个 php 表单脚本,可以将访问者的请求通过电子邮件发送到 requests@website.com。
当我在不同域的临时服务器上编写此代码时,一切正常。当我将其移至 website.com 时,邮件消息从未到达。 Web 服务器位于具有主要 ISP 的虚拟主机上。
从那时起,我学到了以下知识:我的客户的邮件服务器是 Microsoft Exchange,实际安装在他们办公室的一个盒子上。每当外界有人向 requests@website.com 发送电子邮件时,邮件就会到达。 但是如果网络服务器发送到相同的电子邮件地址,它每次都会失败。这不是 PHP 问题。我将 shell 保护到 Web 服务器,并使用 sendmail 和 UNIX 邮件应用程序对此进行了测试。我还通过从 shell 发送各种电子邮件帐户来测试它。例如,我可以给自己发送电子邮件,而不会发送 website.com 域中的任何人。
简而言之,当我登录到 website.com 时,发送到 requests@website.com、user@website.com、another_user@website.com 的邮件都失败了。所有其他地址都可以正常工作。我发现那些被丢弃的电子邮件会被路由到网络服务器的“catchall”帐户,它们位于收件箱中。
我在 website.com 上进行了 MX 查找。 MX 记录指向 mailsec.website.com。我可以远程登录到 mailsec.website.com 的 25 端口并查看 SMTP 服务器。
在我看来,website.com 在向 requests@website.com 发送邮件时没有进行 MX 查找。我的理论是,它将域识别为本地域,看到没有“请求”用户帐户可以将其传递到,然后将邮件放入包罗万象的帐户中。我想要的是强制 sendmail 进行 MX 查找并将邮件发送到 Exchange 服务器。我在这里束手无策。我不知道该怎么做。
就此而言,我可能离这里很远,并且完全误诊了这一点。互联网邮件和 MX 对我来说一直是一门魔法,而我的无知肯定会在这个问题中表现出来。
【问题讨论】:
查看serverfault.com/questions/98283/… 的讨论。 Pawel 的回应帮了我的忙。 【参考方案1】:我认为问题在于 sendmail(您的进程)正在与本地 sendmail 守护进程通信。本地 sendmail 守护进程认为,因为它是 website.com,它应该知道如何发送电子邮件。不幸的是,网络服务器上不存在 to 字段中的实际地址,因此它将其转储到“catchall”邮箱中。您应该与您的 ISP 交谈并让他们更新其 sendmail 配置,以便发送至 ...@website.com 的邮件转发到邮件交换器,而不是在本地处理。
【讨论】:
【参考方案2】:默认情况下,Sendmail 会猜测本地电子邮件域的列表。 可以使用 sendmail.mc 文件中的以下行将其关闭:
define(`confDONT_PROBE_INTERFACES',`True')
作为根列表本地电子邮件域在更改前后使用:
echo '$=w' | sendmail -Am -bt
在禁用自动猜测后,您将看到应该“手动”将哪些域添加到(通常)/etc/mail/local-host-names 文件中。
更改sendmail.mc
后:
-
生成/编译新的
sendmail.cf
文件
重启 sendmail 守护进程(或发送 HUP 信号)
【讨论】:
【参考方案3】:tvanfosson 基本上有它,但作为一种临时解决方法,您应该能够更改您的脚本,以便它发送邮件“user@mailsec.website.com”,然后邮件将被传递到实际的邮件服务器。
【讨论】:
【参考方案4】:编辑 tsm.cf 文件(在 /etc/mail/ 或类似文件中)以包含
FEATURE(relay_entire_domain)
在 DOMAIN() 和 MAILER() 行之间。由于您正在编辑文件,因此您可能还希望使用
来提高安全性define(`confPRIVACY_FLAGS',``noexpn,novrfy'')
更改 tsm.cf 文件(或 any sendmail 配置文件)后,重新启动或 SIGHUP sendmail 进程。
此更改是必要的,因为域的 WWW 和 MX 服务器不存在于同一进程空间中;此 FEATURE 触发 sendmail 使用其外部传递机制处理域的消息。
tsm.cf 文件的编辑部分应类似于:
DOMAIN(website.com)dnl
FEATURE(relay_entire_domain)dnl
define(`confPRIVACY_FLAGS',``noexpn,novrfy'')dnl
MAILER(smtp)dnl
MAILER(procmail)dnl
【讨论】:
【参考方案5】:对我有用的是在托管网站的网络服务器上添加一条 MX 记录,该记录指向原始域名服务器上分配的主机。在此处介绍的情况下,mx 记录指向:mailsec.website.com
【讨论】:
【参考方案6】:我是新来的。想扩展 RB_CWI 答案,但我不允许发表评论。 他的解决方案效果很好。
您不需要定义 DOMAIN()。
但是,在我的系统上,我需要安装 sendmail-cf 软件包。
以下说明是在 CentOS 6.5
上完成的首先,安装sendmail-cf
sudo yum install sendmail-cf
然后,编辑 senmail.mc
sudo vi /etc/mail/sendmail.mc
在文件底部添加FEATURE(relay_entire_domain)dnl,如下所示:
...
FEATURE(relay_entire_domain)dnl
MAILER(smtp)dnl # right above this line
MAILER(procmail)dnl
dnl MAILER(cyrusv2)dnl
保存文件,然后重新启动 sendmail。
sudo service sendmail restart
【讨论】:
【参考方案7】:遇到了同样的问题。 MX 指向外部 Exchange 服务器,但 php/sendmail 没有查找此记录。相反,由 WordPress 在此网络服务器上发布的邮件会被放到通用邮箱中。
解决方案是删除网络服务器上的所有邮箱。现在 sendmail 对 MX 感兴趣,所有邮件都转到了 Exchange。
但是,Exchange 使用网络空间的邮件服务器作为外发邮件的 SmartHost。作为解决方案,我们能够使用 FTP 凭据来访问邮件服务器。我认为这个解决方案并不适用于这个星球上的每个提供商,但在我们的案例 (all-inkl.com) 中它成功了。
【讨论】:
以上是关于当邮件服务器不在网络主机上时发送邮件和 MX 记录的主要内容,如果未能解决你的问题,请参考以下文章