1

使用 Zend 框架 1.12、PHP 5.3.1。为 Zend_Mail 指定多个邮件收件人并使用 Smtp 传输,“To:”标头包含以逗号分隔的收件人列表。例如

To: a@example.com,b@example.com

根据RFC 2822,这似乎是正确的语法。我添加了 DKIM 签名(使用https://github.com/louisameline/php-mail-signature),它可以正常工作,生成 gmail 和其他验证者接受的传递签名,只有一个 To: 收件人。但是对于多个recipents,签名失败。

发送签名邮件check-auth@verifier.port25.com将电子邮件返回到 Return-path,其中包含各种检查的结果,其中包含它计算的标头和正文的规范化版本。我看到它在规范化 To: 标头时在每个逗号后添加了一个空格(我正在为标头和正文指定宽松的规范化)。事实上,我在规范化 To: 标头时破解了我的签名生成以添加该空间,这解决了问题:port25.com 验证程序、gmail 和其他人现在通过了签名。

但是在我看到的关于 DKIM 宽松规范化的任何描述中,包括对RFC 6376的第 3.4 节的非常仔细的阅读,以及我从上面引用的 github 下载的签名类中的代码,都没有添加任何空白的地方存在于原件中;指定的规范化都是关于更改现有空格的。

所以在我看来,由 port25 验证器完成的规范化与 RFC 6376 不一致——除了 gmail、autorespond+dkim-relaxed@dk.elandsys.com 和http://www.appmaildev 等其他 DKIM 验证器。 com/en/dkim/都同意最终结果(他们没有像 port25 那样显示他们执行的规范化,但如果我不规范化逗号后的空格,他们会拒绝签名)。

这里有人对此有任何见解吗?由于该领域的实践似乎与 2011 年的 RFC 一致,难道不应该更新 RFC 吗?当然还有一个问题,在 WSP 被单个空格替换之前,是否应该将 To: 标头值中的所有逗号规范化为逗号空间,以及是否影响任何其他标头。

最终决议摘要

关于 OP,Evan 的回答完全正确:我的 MTA 是在添加空间,而不是验证器的规范化。我只是没有仔细查看实际收到的 To: 标头。

但是知道这一点并不能完全解决生成正确签名的问题。“根本”问题是 Zend_Mail 使用逗号在标题中生成地址列表值,而没有后面的空格作为分隔符 - 尽管它是完全有效的语法,但对于 MTA 来说,在每个之后引入一个空格也是完全有效的。RFC 6376 指定并广泛实施的宽松规范化不适应这种 MTA 重写。将 Zend_Mail 代码更改为使用逗号空格作为分隔符将是微不足道的,除了它是在一个相当长且复杂的方法中间完成的,该方法将涉及主要的复制粘贴来覆盖,这感觉是错误的。所以我最终做的是编写一个预过滤器,在签名之前将空格放在标题中。

preg_replace('/(@[a-z0-9]+(\.[a-z0-9-]+)*>?,)([^ ])/i', '\1 \3', $header_value)
4

1 回答 1

1

您的 MTA 是什么,在哪个平台下?

我相信它可能是修改您的标题的人,而不是收件人应用程序。

注意:我是您提到的库的维护者。

于 2014-02-08T17:08:21.003 回答