Es gibt ein grundlegendes Problem beim Versuch, DKIM-Signaturen mit System.Net.Mail.MailMessage und System.Net.Mail.SmtpClient durchzuführen, nämlich dass Sie zur Signierung der Nachricht die internen Strukturen von SmtpClient durchsuchen müssen, um den Nachrichtentext als einen der Schritte zur Erzeugung des DKIM-Signatur-Headers zu hashen. Das Problem tritt auf, wenn Sie alternative Ansichten oder Anhänge haben, da SmtpClient jedes Mal neue multipart-Grenzen generiert, wenn es die Nachricht schreibt, was den Textkörperhash und somit die DKIM-Signatur-Validität unterbricht.
Um dieses Problem zu umgehen, können Sie die Open-Source-Bibliotheken MimeKit und MailKit für .NET als alternatives Framework zur Verwendung von System.Net.Mail verwenden.
Um eine DKIM-Signatur zu einer Nachricht in MimeKit hinzuzufügen, könnten Sie etwas Ähnliches wie folgt tun:
MimeMessage message = MimeMessage.CreateFromMailMessage(mailMessage);
HeaderId[] headersToSign = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date };
string domain = "beispiel.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",
};
// Bereiten Sie den Nachrichtentext darauf vor, über einen 7-Bit-Transport (wie z.B. ältere Versionen von SMTP) gesendet zu werden. Dies ist SEHR wichtig, da die Nachricht nicht mehr geändert werden kann, nachdem sie DKIM-signiert wurde!
//
// Hinweis: Wenn der SMTP-Server, über den Sie die Nachricht senden, die 8BITMIME-Erweiterung unterstützt, können Sie stattdessen `EncodingConstraint.EightBit` verwenden.
message.Prepare (EncodingConstraint.SevenBit);
message.Sign (signer, headersToSign,
DkimCanonicalizationAlgorithm.Relaxed,
DkimCanonicalizationAlgorithm.Simple);
Um die Nachricht mit MailKit zu senden, könnten Sie etwas Ähnliches wie folgt tun:
using (var client = new MailKit.Net.Smtp.SmtpClient ()) {
client.Connect ("smtp.gmail.com", 465, true);
client.Authenticate ("benutzername", "passwort");
client.Send (message);
client.Disconnect (true);
}
Hoffentlich hilft das.