在一些(并非全部)收到的电子邮件中(特别是仅通过“批量”服务发送的电子邮件),我收到 DKIM 失败:“签名验证失败”。以下是一个例子:
Received message headers
DKIM-Filter: OpenDKIM Filter v2.10.3 mail.example.com 3rfbq51KBTz2xF0
Authentication-Results: dkim.example.com/3rfbq51KBTz2xF0;
dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=proxyvote.com [email protected] header.b=XjB07H1q
但检查“dkim-stats”时,它显示“已通过”
opendkim-stats dkim-stats
Job 3rfbq51KBTz2xF0 at edge (size 12124)
received via 127.0.0.1 at Wed Jun 29 01:45:37 2016
from domain = 'proxyvote.com'
Signature 1 from proxyvote.com
PASSED
signed bytes: (whole message)
Signature properties:
Key properties:
DNSSEC status: INSECURE
以下是该消息的附带转储
cat dkim.3rfbq51KBTz2xF0.4dDfiv
Date: Wed, 29 Jun 2016 03:10:40 -0400
From: "PROXYVOTE" <[email protected]>
To: [email protected]
Subject: Semi-Annual Report
message-id: <[email protected]>
Reply-To: "PROXYVOTE" <[email protected]>
MIME-Version: 1.0
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;
d=proxyvote.com; [email protected]; q=dns/txt;
s=edppsuirna01; t=1467189937; x=1498725937;
h=date:from:to:subject:message-id:reply-to:mime-version;
bh=H5lkhcTIjxd0B3N4Kdj314qELLpSKZvAAtPAS+XcM1A=;
为什么我会同时得到“失败”和“通过”的结果?我需要做什么才能解决这个问题?
答案1
Jason,您能将 改为 吗c=simple/simple
?c=relaxed\relaxed
我见过很多次不同的 DKIM 验证器在空格折叠方面遇到困难。您说它只在“Bulk”时失败,所以这告诉我您正在通过某些 SMTP 服务发送此邮件,这让我更倾向于相信标头正在被重写,而 simple/simple 的空格折叠是罪魁祸首。您也可以运行邮件测试它会使用 4 个不同的 DKIM 验证器对其进行测试 - 如果四个都失败。当您通过批量服务发送时,可能就会发生这种情况。
以下更新部分
由于您收到了电子邮件,因此您仍然可以重新处理它并使用另一个验证器检查 DKIM。当我认为我的电子邮件服务器可能错误地处理 DKIM 时,这就是我进行健全性检查的方法。我使用 Limilabs Mail.dll 来处理 EML 的发送,但您可以使用任何您想要的,使用任何您熟悉的编程语言。DKIM 保持完整,您将能够使用在线自动回复程序根据其他 DKIM 验证器对其进行验证。
Dim email As IMail
Dim mb As New Limilabs.Mail.MailBuilder
Dim smtpMail As SmtpMail = SmtpMail.CreateFromEmlFile("D:\ValidateDKIM\BadDKIM.eml")
email = mb.CreateFromEml(smtpMail.RawEmlData)
Using client As New Smtp()
client.ConnectSSL("mailserver", 465)
client.Login("mailserver", "password")
Dim stream As System.Net.Security.SslStream = client.ReadStream()
Dim reader As IO.StreamReader = New IO.StreamReader(stream)
client.SendMessage(New SmtpMail("Mail Check", { "[email protected]","[email protected]"}, smtpMail.RawEmlData))
client.Close()
End Using