.NET MailMessage和AlternativeViews中的DKIM

时间:2011-06-04 15:58:04

标签: c# .net dkim

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

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

有什么方法可以解决这个问题吗?在将它们分配给MailMessage对象之前,可能会签署HTML和纯文本替代视图吗?或者可能使用其他组件?

编辑:

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

3 个答案:

答案 0 :(得分:2)

您可以尝试Mail.dll email component它支持DKIM,包括:签名和验证:

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

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

答案 1 :(得分:2)

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

如果您还需要SMTP,POP3和/或IMAP支持,请查看构建于MimeKit之上的MimeKit

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

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

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为多部分消息生成一组新的边界标记(当您有附件或AlternativeView时使用该边界标记),您无法使用DKIM.Net对所述消息进行签名,因为签名将会中断当你实际去发送邮件时,因为MIME格式的邮件正文已经改变了。

答案 2 :(得分:1)

我已经在DKIM.Net网站上更新了我的解释,以解释这个限制。这主要是由于System.Net.Mail.SmtpClient生成边界以分离备用视图或附件的方式 - 它们是新的Guid,因此每次发送消息时边界ID都会更改 - 如果内容发生更改,则签名失败。该代码通过使用虚拟流发送MailMessage来攻击SmptClient以获取电子邮件的完整内容。