使用Zend Framework 1.12,PHP 5.3.1。将多个邮件收件人指定给Zend_Mail并使用Smtp传输,“收件人:”标题包含以逗号分隔的收件人列表。 E.g。
To: a@example.com,b@example.com
根据RFC 2822,这似乎是正确的语法。 我已经添加了DKIM签名(使用https://github.com/louisameline/php-mail-signature),它可以正常工作,生成gmail接受的传递签名和其他带有单个收件人的验证者。但对于多个配方,签名失败。
向check-auth@verifier.port25.com
发送已签名的邮件会向返回路径返回一封电子邮件,其中包含各种检查结果中计算出的标题和正文的规范化版本。我看到它在每个逗号之后添加了一个空格,当规范化To:标题时(我为标题和正文指定了轻松的规范化)。事实上,当标准化To:标题时,我破解了我的签名生成以添加该空间,这解决了问题:port25.com验证程序,gmail和其他人现在通过了签名。
但是在任何我已经看过DKIM轻松规范化的描述中,包括仔细阅读RFC 6376的3.4节,以及我从上面引用的github下载的签名类中的代码,没有什么 添加 原始空格中没有空格的空格;指定的规范化都是关于改变现有的空格。
所以在我看来,port25验证程序正在进行的规范化与RFC 6376不一致 - 除了gmail,autorespond + dkim-relaxed @ dk.elandsys.com和http://www.appmaildev.com/en/dkim/之外的其他DKIM验证程序所有人都同意最终结果(他们没有像port25那样显示他们执行的规范化,但是如果我不用逗号后面的空格进行规范化,他们会拒绝签名)。
有没有人对此有任何见解?由于该领域的实践似乎与2011年的RFC不一致,因此不应该更新RFC吗?当然还有一个问题是,在将WSP替换为单个空格之前,是否应将To:标头值中的所有逗号规范化为逗号空间,以及是否有任何其他标头受影响。
最终解决方案摘要
Evan对OP的回答是完全正确的:我的MTA正在添加 空间,而不是验证者的规范化。我没有 仔细观察了实际上已经过的To:标题 接收。
但是知道这并不会产生一个完全无关紧要的解决方案 生成正确签名的问题。 “根”问题是 Zend_Mail使用逗号在标头中生成地址列表值 没有后续空格作为分隔符 - 虽然它是完美的 有效的语法,它也非常适合MTA引入 每一个之后的空间。并指定了轻松的规范化 RFC 6376并且广泛实施不适用于这样的MTA 改写。更改Zend_Mail代码以使用逗号空间作为 分隔符将是微不足道的,除了它是在a的中间完成 相当长且复杂的方法,涉及主要的复制粘贴 覆盖,感觉不对。所以我最终做的就是写一个 预过滤器,在签名之前将空间放入标题中。 尽管所有可能的语法变化都不是100%完美 包括注释,将以下preg_replace应用于值 To:,Cc:和Reply-To:标题对我有用:
preg_replace('/(@[a-z0-9]+(\.[a-z0-9-]+)*>?,)([^ ])/i', '\1 \3', $header_value)
答案 0 :(得分:1)
您的MTA是什么,在哪个平台下?
我认为可能是修改标题的人,而不是收件人应用程序。
注意:我是你提到的图书馆的维护者。