我用 C# 编写了一个发送电子邮件的程序。现在我需要使用 Dominkeys/DKIM 签署出站电子邮件,但我不知道该怎么做。
我已经设置了所有密钥,但我不知道如何获取这些密钥以及如何将它们包含在电子邮件标题中。
我用 C# 编写了一个发送电子邮件的程序。现在我需要使用 Dominkeys/DKIM 签署出站电子邮件,但我不知道该怎么做。
我已经设置了所有密钥,但我不知道如何获取这些密钥以及如何将它们包含在电子邮件标题中。
尝试使用 System.Net.Mail.MailMessage 和 System.Net.Mail.SmtpClient 进行 DKIM 签名存在一个基本问题,即为了对消息进行签名,您需要戳 SmtpClient 的内部以散列消息正文作为生成 DKIM-Signature 标头的步骤之一。当您有替代视图或附件时,问题就出现了,因为 SmtpClient 每次写出破坏正文哈希并因此破坏 DKIM 签名有效性的消息时都会生成新的多部分边界。
要解决此问题,您可以使用适用于 .NET 的MimeKit和MailKit开源库作为使用 System.Net.Mail 的替代框架。
要将 DKIM 签名添加到 MimeKit 中的消息,您可以执行以下操作:
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);
}
希望有帮助。
请参阅https://github.com/dmcgiv/DKIM.Net它是用 C# 编写的 .Net 的 DomainKeys Identified Mail (DKIM) 实现 - 它使您能够签署 MailMessage 对象。
它不仅允许使用 DKIM 进行签名,还可以包括 S/MIME 证书、PGP 证书等。此外,它是一个非常成熟的库 - 我发现唯一一个可以正确处理外语(除了英语)的库,因为它完全彻底地编码了 unicode。
它是免费和开源的。
当使用 Mailenable 作为 SMTP 中继服务器时,这为我解决了这个问题。
http://www.mailenable.com/kb/content/article.asp?ID=ME020700
在域名上创建 DKIM TXT 记录时,不要忘记使用活动选择器作为前缀 => yourselector._domainkey.yourdomainname.be
如果您希望对 MailMessage 的正文进行 DKIM 签名,那么 DKIM.NET 非常棒。如果您希望在您的消息中有替代视图,那么我无法找到解决方案并编写了自己的解决方案(带有通常免责声明的开源),可以在https://github.com/yannispsarras/DKIM-AlternativeViews找到
我知道这是一个非常古老的线程,但我认为它可能会对某人有所帮助。
我在这个问题上没有找到太多帮助,但我的问题通过配置 smtp 服务器得到了解决。我无法发布这些步骤,因为我使用的是 3rd 方 smtp 服务器,并且每个服务器都有自己的配置。正确配置后,我的 smtp 会自动添加 DM/DKIM 签名。