Существует фундаментальная проблема с попыткой сделать подписи DKIM с помощью System.Net.Mail.MailMessage и System.Net.Mail.SmtpClient, который заключается в том, что для подписания сообщения вам необходимо вытолкнуть внутренние элементы SmtpClient в чтобы хэш-элемент сообщения был одним из шагов при создании заголовка DKIM-Signature. Проблема возникает, когда у вас есть альтернативные представления или вложения, потому что SmtpClient будет генерировать новые многостраничные границы каждый раз, когда он выписывает сообщение, которое нарушает хеш тела и, следовательно, действительность DKIM-Signature.
Чтобы обойти это, вы можете использовать библиотеки с открытым кодом для MimeKit и MailKit для .NET в качестве альтернативной структуры для использования 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);
}
Надеюсь, это поможет.
Вы нашли решение с помощью Windows SMTP Server? – Josh
проверить мой принятый ответ. – Nnp