使用PHP发送邮件时,DKIM签名无法验证

6
我在使用gmail/hotmail时遇到了一个问题,他们将我的服务器发送的邮件过滤为垃圾邮件。Spam Assassin得分非常低,所以我知道我的IP没有被列入任何黑名单中,这意味着是gmail/hotmail使用的过滤器阻止了邮件的传递。
我进行了一些研究,发现使用DKIM可能会解决我遇到的问题。我在服务器上启用了DKIM。现在,当我使用电子邮件客户端发送电子邮件时,位于此处的工具(http://www.brandonchecketts.com/emailtest.php)报告DKIM签名有效。
下一步是将DKIM签名实现到我的PHP邮件中。所以我使用了这个DKIM类,它位于这里(http://sourceforge.net/projects/dkim-class-php/),这是PHPMailer的一个衍生版本。
然而,现在当我发送电子邮件时,尽管包含DKIM签名,但我从验证工具中获得了一个奇怪的错误。
result = fail
Details: message has been altered

你可以在此处查看完整报告:http://www.brandonchecketts.com/emailtest.php?email=K86KTXpMbl%40www.brandonchecketts.com 感谢您的帮助,我正在拼命让它工作,并已经苦思冥想了几个小时。

1
您似乎正在签署发件人和主题头(以及正文)。您应该检查在您和测试程序之间的任何邮件服务器是否更改了这些标题或正文内容。问题也可能是DKIM签名器类存在漏洞或使用了错误的密钥。 - Borealid
我该如何检查是否有邮件服务器改变了正文内容? 另外,密钥肯定是正确的,我刚刚双重检查过了。 - nmford
检查您发送的消息以及测试程序接收到的消息。确保在已签名的地方它们是完全相同的。 - Borealid
2个回答

4
我在这里给出了答案:如何在基于PHP的SMTP客户端中设置DomainKeys/DKIM
基本上,您需要确保提供所有的头文件,以便您的MTA添加到发出的电子邮件中。由于不同的系统配置不同,因此没有一个适用于所有情况的解决方案。
查看未能签名(并显示“消息已更改”错误)的消息源,以确定添加了哪些头文件。通常,您的MTA将添加“Message-ID”和“Date”标头(如果缺少“Date”标头,则可能导致低垃圾邮件评分,因此您也可以包括它!)。
另一个常见错误是,在签署消息后自己修改消息,因此请确保在签署消息之后不会在您的代码中进行任何修改。
确定添加了哪些标头后,您应该在签署电子邮件之前自己添加这些标头(从而覆盖了MTA添加它们的默认行为)。

0
我发现php mail() + postfix与dkim的奇怪行为:
如果您进行
$headers .= "From: USER <$from_email>\n";

DKIM会不正确,但如果你这样做:

$headers .= "From: USER <" . $from_email . ">\n";

一切正常!很奇怪。用户还建议进行修改。

trim($emailContent) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接