当邮件服务器不在网络主机上时发送邮件和 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 记录的主要内容,如果未能解决你的问题,请参考以下文章

关于MX记录的问题

在DNS系统中的MX记录有啥作用

单独的网络和电子邮件主机

ruby Ping一个电子邮件地址以查看它是否存在。此脚本解析MX记录以查找负责向广告发送邮件的SMTP服务器

JavaMail直接发送邮件

zimbra填坑记录