如何使用C#SMTP客户端进行Domainkeys / DKIM电子邮件签名?

时间:2010-03-01 18:33:16

标签: c# email smtp dkim domainkeys

我用C#编写了一个发送电子邮件的程序。现在我需要使用Dominkeys / DKIM签署出站电子邮件,但我不知道该怎么做。

我已经设置了所有密钥,但我不知道如何让它们和hwo将它们包含在电子邮件标题中。

7 个答案:

答案 0 :(得分:14)

尝试使用System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient进行DKIM签名存在一个根本问题,为了对邮件进行签名,您需要按顺序查看SmtpClient的内部结构将消息体散列为生成DKIM-Signature标头的步骤之一。当您有其他视图或附件时会出现问题,因为SmtpClient每次写出破坏正文哈希值的消息时都会生成新的多部分边界,从而产生DKIM签名的有效性。

要解决此问题,您可以使用.NET的MimeKitMailKit开源库作为使用System.Net.Mail的替代框架。

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

MimeMessage message = MimeMessage.CreateFromMailMessage(mailMessage);
HeaderId[] headersToSign =  new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date };

string domain = "example.net";
string selector = "brisbane";

DkimSigner signer = new DkimSigner ("C:\my-dkim-key.pem", domain, selector) 
{
   SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1,
   AgentOrUserIdentifier = "@eng.example.com",
   QueryMethod = "dns/txt",      
};

// Prepare the message body to be sent over a 7bit transport (such as 
// older versions of SMTP). This is VERY important because the message
// cannot be modified once we DKIM-sign our message!
//
// Note: If the SMTP server you will be sending the message over 
// supports the 8BITMIME extension, then you can use
// `EncodingConstraint.EightBit` instead.
message.Prepare (EncodingConstraint.SevenBit);

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

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

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

希望有所帮助。

答案 1 :(得分:6)

请参阅https://github.com/dmcgiv/DKIM.Net这是用C#编写的.Net的DomainKeys Identified Mail(DKIM)实现 - 它使您能够签署MailMessage对象。

答案 2 :(得分:2)

我也想知道 我只是找到一个dkim工具,但我不能运行成功-_- http://tinisles.blogspot.com/2009/09/sending-dkim-email-from-c.html

答案 3 :(得分:2)

使用 http://www.mimekit.org

它不仅允许使用DKIM进行签名,还可以包含S / MIME证书,PGP证书等。 此外,它是一个非常成熟的lib - 我发现只有正确处理外语(除英语之外)的文章,因为它完全彻底地用unicode编码。

它的免费和开源。

答案 4 :(得分:1)

如果您希望DKIM签署MailMessage的正文,那么DKIM.NET很棒。如果您希望在您的消息中有其他观点,那么我无法找到解决方案并编写了我自己的(开放源码与通常的免责声明),可以在https://github.com/yannispsarras/DKIM-AlternativeViews找到

我知道这是一个非常古老的帖子,但我认为这可能有助于某人。

答案 5 :(得分:0)

我在这个问题上找不到多少帮助,但我的问题通过配置smtp服务器得到了解决。 我不能发布这些步骤,因为我正在使用第三方smtp服务器,每个服务器都有自己的配置。正确配置后,我的smtp会自动添加DM / DKIM签名。

答案 6 :(得分:0)

使用Mailenable作为SMTP中继服务器时,这为我解决了这个问题。

http://www.mailenable.com/kb/content/article.asp?ID=ME020700

在域名上创建DKIM TXT记录时,请不要忘记使用活动选择器作为前缀=> yourselector._domainkey.yourdomainname.be