DKIM仅适用于短消息

时间:2016-11-04 23:22:52

标签: php dkim postfix

问题:

我正在使用OpenDKIM和Postfix。邮件使用以下代码在PHP中生成,然后使用mail()发送:

// message
$message  = "--$hash".PHP_EOL;
$message .= "Content-Type: text/plain; charset=\"iso-8859-1\"".PHP_EOL;
$message .= "Content-Transfer-Encoding: base64".PHP_EOL.PHP_EOL;
$message .= base64_encode($body).PHP_EOL.PHP_EOL;
$message .= "--$hash".PHP_EOL;

OpenDKIM适用于长度不超过742个字符的任何邮件,但如果邮件为742个字符或更长,Google会报告DKIM" body hash did not verify"。

看看DKIM和Google,我无法找到导致这种情况的任何信息。我尝试了741个字符(全部通过)的多个消息和742个字符的多个消息(全部失败)。

错误:

唯一的错误是Google收到了电子邮件(它说它无法进行身份验证):

dkim=neutral (body hash did not verify) header.i=@mailer.example.com;

/var/log/maillog在成功和不成功的电子邮件中有以下内容(或类似内容):

Nov  5 00:58:57 ip-XX-XX-XX-XX opendkim[3953]: 7D2946081A: DKIM-Signature field added (s=default, d=mailer.example.com)

解决方案:

根据@Adrien Lebner的解决方案,这是一个简单的改变

base64_encode($body)

chunk_split(base64_encode($body), 76, PHP_EOL)

解决了这个问题。

1 个答案:

答案 0 :(得分:1)

如果您在多行上发送相同的内容怎么办?

如果行长太长,DKIM可能会中断:

  

2.1.1。线长限制

     

此规范对数字有两个限制   一行中的字符。每一行字符都必须不再存在   超过998个字符,且不应超过78个字符,   不包括CRLF。