我有一个设置了多个域的 VPS。一些域有发送电子邮件的 PHP 站点。结果发现一些电子邮件服务器拒绝这些电子邮件,并显示错误:“发件人地址被拒绝:未找到域”。(这来自服务器上 exim_mainlog 中的日志)。
有趣的是,它报告用作发件人的域不是我在 php mail() 中设置的域,而是一个内部服务器名称。
例如,如果我的 VPS 主域是 mymasterdomain.com 并且我有多个站点(例如 site1.com、site2.com 等),那么发送电子邮件的 php 程序将发送带有标题中设置的发件人字段的电子邮件到:[电子邮件保护]但邮件将被拒绝,并显示“发件人地址被拒绝:未找到域名[电子邮件保护]“”。
com.mymasterdomain.com 是托管公司内部识别我的 VPS 服务器的方式,显然它无法解析任何东西。
SPF 记录已正确设置,以包含站点的 IP 地址。我使用 php 将同一封电子邮件发送到两个地址进行了测试。一个地址拒绝了它,但另一个在 gmail 帐户上接受它,这让我可以查看标题。
我可以看到问题-标题有:
已收到:来自 cpanelSite1Account,发送者为 com.mymasterdomain.com,本地(Exim 4.91)(信封发件人)id 1fWXCF-0006ED-Vv;2018 年 6 月 22 日星期五 09:37:56 -0500
到:[电子邮件保护]
主题:收到新询问
X-PHP-Script:www.site1.com/inquire_process.php 适用于 XXX.XXX.XXX.XXX
X-PHP-原始脚本:522:inquire_process.php
从:[电子邮件保护]
[发件人:] 是正确的,但是 [收到:来自] 包含 VPS 信息,这给我带来了麻烦。
我该如何修复这个问题?在 php 中?在 cpanel 中?在 sendmail 或 exim 设置中?任何帮助都将不胜感激 - 我已经为此烦恼了一段时间了...
答案1
可能会发生以下情况:
- 接收 MTA 检查是否存在信封发件人而不是
From:
标题。 - PHP 函数调用的 Sendmail
mail()
使用[email protected]
作为信封发件人,[email protected]
而标题参数mail(to,subject,message,headers,parameters);
仅用于生成邮件头。 - Sendmail 从 中为其自身找到的第一个主机获取其自己的主机名
/etc/hosts
。
您可以在任何级别修复此问题(按相应顺序的解决方案,而不是最好的解决方案):
- 通过添加记录使用作信封发件人的域/主机名存在
A
。 使用额外的范围向 Sendmail 提供信封发件人:
mail('[email protected]','subject','message', 'From: [email protected]', '-f [email protected]');
从
man sendmail
:-f sender
设置信封发件人地址。这是发送递送问题的地址。
/etc/hosts
在您的行中添加现有主机名127.0.0.1
或实际服务器 IP。这必须是A
来自现有域的记录,指向您的服务器。
我认为解决方案#2 最接近您的目标,而解决方案#1 和#3 可能会解决背后的问题。