我让 postfix 和 opendkim 运行起来。postfix 通过 unix 套接字与 opendkim 通信。只要我不将一些特殊的邮件头字段添加到 opendkim 应签名的字段列表中,所有这些都可以正常工作。
后缀配置:
主文件:
...
smtpd_milters = unix:/var/spool/postfix/milter/opendkim
non_smtpd_milters = unix:/var/spool/postfix/milter/opendkim
...
在我的 opendkim.conf 中我有以下条目:
...
AlwaysSignHeaders To,Subject,MIME-Version,Content-Type,Sender,From,Message-Id,Date,Reply-To,List-Unsubscribe
...
如果我使用 postfix sendmail 命令发送一封电子邮件,如下所示
sendmail -f [email protected] -i -t <<EOF
From: [email protected]
Sender: [email protected]
To: [email protected]
Subject: Test
Test
EOF
Gmail 将通知我:
dkim=hardfail
使用
Diagnostics true
opendkim.conf 中的条目通过“z=...”调试邮件头条目显示,opendkim 没有在签名中包含“Message-Id”和“Sender”字段,但报告了包含以下内容:
h=From:To:Subject:Date:MIME-Version:Content-Type:Sender:Reply-To:List-Unsubscribe;
邮件头条目。
深入研究后我发现,当我从 opendkim.conf 中的“AlwaysSignHeaders”条目中删除 Message-Id 和 Sender 字段后,Gmail 就又恢复正常了。
因为我使用 sendmail 命令发送邮件,所以我可以确定至少“发件人:”字段从一开始就必须对 postfix 和 opendkim 可用。
因此,如果 opendkim 将使用它获得的所有标头字段,则意味着 postfix 不会向 opendkim 提供所有标头字段。我尝试通过打开 postfix 的“清理”和“简单重写”过程的详细日志记录来验证这一点,但我不得不承认,我在日志中看不到任何有用的信息,特别是我无法提取 postfix 向 opendkim 提供的邮件标头字段的信息。如果有人可以利用它,我可以在这里发布这些日志...
我没什么主意了,所以我希望有人能给我一些有用的指点......
答案1
我找到了原因(在 opendkim 邮件列表的好心人的帮助下):
在我的 opendkim.conf 文件中我只有字段
AlwaysSignHeaders From,Sender,To,CC,Subject,Message-Id,Date
指定。事实证明,您还需要添加 SignHeaders 字段,因此现在配置如下所示:
...
SignHeaders From,Sender,To,CC,Subject,Message-Id,Date
AlwaysSignHeaders From,Sender,To,CC,Subject,Message-Id,Date
...
就是这样。
编辑:
opendkim 的人们指出AlwaysSignHeaders已弃用,覆盖标头应该使用。
答案2
您是否尝试过使用以下方式签署测试消息两个都是否存在消息 ID:和发件人:标头?
您的问题可能是由于 milter 获取消息版本前posstfix/MTA 添加了上面提到的标题(我确信任何好的 MTA 修复都缺少 Message-Id:标题)。
http://www.elandsys.com/resources/sendmail/dkim.html: DKIM 使用电子邮件标头和正文生成签名。如果在签名后重写标头或将文本附加到邮件正文,则 dkim 验证失败。
PS 恕我直言,opendkim 应该提供选项来生成自身缺失的消息 ID:
为未来的读者添加:OpenDKIM 提供了调试“标头已更改”问题的选项:KeepTemporaryFiles
和TemporaryDirectory