我已经用C#编写了一个发送电子邮件的程序。现在,我需要使用Dominkeys/DKIM对出站电子邮件进行签名,但是我不确定该怎么做。
我已经设置了所有 key ,但是我不知道如何获取 key 以及如何将其包含在电子邮件标题中。

最佳答案

尝试使用System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient进行DKIM签名存在一个基本问题,即为了对消息进行签名,您需要戳破SmtpClient的内部内容以对消息正文作为生成DKIM-Signature header 的步骤之一。当您有其他 View 或附件时,就会出现问题,因为SmtpClient每次在写出破坏正文哈希并因此破坏DKIM-Signature有效性的消息时,都会生成新的多部分边界。

要解决此问题,可以使用.NET的MimeKitMailKit开源库作为使用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);
}

希望能有所帮助。

关于c# - 如何使用C#SMTP客户端对Domainkeys/DKIM电子邮件进行签名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2358095/

10-10 13:54