8

我正在使用 DKIM.NET (https://github.com/dmcgiv/DKIM.Net) 对 MailMessage 进行签名,然后再将其发送给收件人。我面临的问题是,当我以 AlternativeViews 的形式将内容作为 HTML 和纯文本插入时,上面的组件对 MailMessage 的正文 (mailMessage.Body) 进行了签名。

结果是我的 mailMessage.Body 为空,但收到的消息正文包含我的替代视图,因此 DKIM 无法正确验证。

有没有办法解决这个问题?也许在将 HTML 和纯文本替代视图分配给 MailMessage 对象之前对其进行签名?或者也许使用另一个组件?

编辑:

自从我开始这个问题以来,我已经在https://github.com/yannispsarras/DKIM-AlternativeViews创建了一个项目- 这绝不是完整或稳定的,但我将它发布在这里以防它对任何想要的人有用为 .NET 中已签名的替代视图找到解决方案。

4

3 回答 3

3

我在MimeKit中添加了对生成和验证 DKIM 签名的完全支持,它是开源的(许可证:MIT),完全免费用于商业用途。

如果您还需要 SMTP、POP3 和/或 IMAP 支持,请查看基于 MimeKit构建的 MailKit。

由于 MimeKit 和 MailKit 不会在每次将它们写入流时生成一组新的边界字符串,因此它们不会遇到使用 System.Net.Mail 和 DKIM.Net[1](不是 DKIM.Net 的错误,要清楚)。

要将 DKIM 签名添加到 MimeKit 中的消息,您可以执行以下操作:

var message = CreateMyMessage ();
var headersToSign = new [] { HeaderId.From, HeaderId.To, 
    HeaderId.Subject, HeaderId.Date };
var signer = new DkimSigner ("C:\my-dkim-key.pem") {
   AgentOrUserIdentifier = "@eng.example.net",
   Domain = "example.net",
   Selector = "brisbane",
};

message.Sign (signer, headersToSign, 
    DkimCanonicalizationAlgorithm.Relaxed, 
    DkimCanonicalizationAlgorithm.Simple);

要使用 MailKit 发送消息,您可以执行以下操作:

using (var client = new SmtpClient ()) {
    client.Connect ("smtp.gmail.com", 465, true);
    client.Authenticate ("username", "password");
    client.Send (message);
    client.Disconnect (true);
}

笔记:

  1. 由于 System.Net.Mail.SmtpClient 为多部分消息(当您有附件或 AlternativeViews 时使用)生成一组新的边界标记,因此您不能使用 DKIM.Net 对所述消息进行签名,因为签名会在您实际使用时中断去发送邮件,因为 MIME 格式的邮件正文将发生变化。
于 2015-06-17T21:52:33.287 回答
2

您可以尝试支持 DKIM 的Mail.dll 电子邮件组件,包括:签名和验证:

http://www.limilabs.com/blog/sign-emails-with-dkim

该组件不是免费的,但请注意我写的。

于 2011-08-06T18:09:24.520 回答
1

我已经更新了 DKIM.Net 网站上的自述文件来解释这个限制。这基本上是由于 System.Net.Mail.SmtpClient 生成边界以分隔替代视图或附件的方式 - 它们是新的 Guid,因此每次发送消息时边界 id 都会更改 - 如果内容发生更改,则签名失败。该代码通过使用虚拟流发送 MailMessage 来破解 SmptClient 以获取电子邮件的全部内容。

于 2011-11-15T01:14:06.723 回答