Сбой подписи DKIM с хэшем тела не проверен для Mimekit 1.10.1.0, Mailkit 1.10.2.0
Я вижу странную проблему, когда DKIM подписывает заголовки с помощью Mailkit & Mimekit, Gmail сообщает об ошибке "dkim= нейтральный (хэш тела не проверен)".
Я делаю что-то не так? Пожалуйста, найдите мой код ниже и скриншоты
фактического полученного письма прилагается.
string ReturnName = "DMC12";
string FromDomain = "backtothefuture.net";
string FromEmail = "marty@" + FromDomain;
string FromName = "Marty McFly";
string SenderName = "Marty McFly";
string ToEmail = "George.mcfly.1960@gmail.com";
string MailServer = "DMC12.large.timemachine.com";
string TextBody = @"If you put your mind to it, you can accomplish anything. One other thing. If you guys ever have kids, and one of them, when he's eight years old, accidentally sets fire to the living room rug... go easy on him!";
string HtmlBody = string.Format(@"<b>如果你把你的头脑,它可以完成任何事情。 另一件事。 如果你们有孩子,其中一个,当他八岁时,不小心把火烧在客厅地毯上...去容易对他!</b>");
string Subject = "Message from Marty (1960)!";
string ToName = "George McFly";
string DKIMdomain = FromDomain;
string DKIMSigner = "btfreturns.com";
string ReturnEmail = "DocBrown@" + MailServer;
string SenderEmail = "marty@" + MailServer;
string privatekey = System.IO.File.ReadAllText("dkim.private.key");
var client = new SmtpClient(new ProtocolLogger("smtp.txt")); // logging SMTP connections
try
{
client.Connect(MailServer, 25);
}
catch (SmtpCommandException ex)
{
Console.WriteLine("Error trying to connect: {0}", ex.Message);
Console.WriteLine("\tStatusCode: {0}", ex.StatusCode);
return;
}
catch (SmtpProtocolException ex)
{
Console.WriteLine("Protocol error while trying to connect: {0}", ex.Message);
return;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return;
}
client.LocalDomain = MailServer;
var message = new MimeMessage();
MailboxAddress RecepientAddress = new MailboxAddress(ToName, ToEmail);
message.From.Add(new MailboxAddress(FromName, FromEmail)); // From Address
var builder = new BodyBuilder();
builder.TextBody = TextBody;
builder.HtmlBody = HtmlBody;
List<MailboxAddress> To = new List<MailboxAddress>();
To.Add(RecepientAddress);
message.Subject = Subject;
message.Body = builder.ToMessageBody();
message.Sender = new MailboxAddress(SenderName, SenderEmail); // Sender Address
message.To.Add(RecepientAddress);
message.MessageId = Guid.NewGuid().ToString("N") + "@" + new System.Net.Mail.MailAddress(message.Sender.Address).Host;
using (Stream s = (new MemoryStream(Encoding.UTF8.GetBytes(privatekey ?? ""))))
{
var headersToSign = new[] { HeaderId.From, HeaderId.To, HeaderId.Subject, HeaderId.Date, HeaderId.MessageId };
var signer = new DkimSigner(s, DKIMdomain, DKIMSigner);
signer.SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1;
message.Sign(signer, headersToSign, DkimCanonicalizationAlgorithm.Relaxed, DkimCanonicalizationAlgorithm.Relaxed);
}
client.Send(message, new MailboxAddress(ReturnName, ReturnEmail), To);
client.Disconnect(true);
client.Connect(MailServer, 25);
client.Dispose();
1 ответ
Проблема в том, что вы не звоните message.Prepare()
перед DKIM подписывает сообщение. Это очень важный шаг, потому что он заставляет все части MIME тела сообщения в соответствующую кодировку, которая будет использоваться для транспорта.
Обратите внимание, что если вы не звоните Prepare()
с соответствующим значением ограничения кодирования, SmtpClient.Send()
Метод в конечном итоге сделает это после того, как вы DKIM подписали сообщение, что сделает подпись недействительной.
Мое предложение заключается в использовании EncodingConstraint.SevenBit
для максимальной совместимости.
Однако, если вы уверены, что ваш SMTP-сервер и все другие SMTP-серверы, через которые будет передаваться ваше сообщение, поддерживают 8BITMIME
расширение, то вы можете попробовать использовать EncodingConstraint.EightBit
вместо.