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