2017-01-31 50 views
2

Я вижу странную проблему, в то время как DKIM подписывает заголовки с Mailkit & Mimekit, Gmail сообщает об ошибке «dkim = neutral (body hash did not проверить)».Подписание DKIM с хеш-телом не подтверждено для Mimekit 1.10.1.0, Mailkit 1.10.2.0

Я делаю что-то не так здесь. Пожалуйста, найдите мой код ниже и скриншоты Gmail image 1headers фактической полученной почты прилагается.

 string ReturnName = "DMC12"; 
     string FromDomain = "backtothefuture.net"; 
     string FromEmail = "[email protected]" + FromDomain; 
     string FromName = "Marty McFly"; 
     string SenderName = "Marty McFly"; 
     string ToEmail = "[email protected]"; 
     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 = "[email protected]" + MailServer; 
     string SenderEmail = "[email protected]" + 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(); 
+0

Думаю, я знаю, в чем проблема. Тот факт, что я использую символы Utf-8 в HtmlBody, приводит к тому, что подпись DKIM терпит неудачу, если я заменю его стандартными Ascii chacaters, он отлично работает и проходит тест с летающими цветами. – Krylor

ответ

2

Проблема заключается в том, что вы не зовете message.Prepare() перед тем DKIM подписания сообщения. Это очень важный шаг, потому что он заставляет все части MIME тела сообщения в соответствующую кодировку использоваться для транспорта.

Обратите внимание, что если вы не вызываете Prepare() с соответствующим значением кодирования ограничения, метод SmtpClient.Send() будет в конечном итоге делает что после вы имеете DKIM подписал сообщение, таким образом недействительность подписи.

Мое предложение состоит в использовании EncodingConstraint.SevenBit для максимальной совместимости.

Однако, если вы доверяете, что ваш SMTP-сервер и все другие SMTP-серверы, которые ваше сообщение будет передавать, поддерживают расширение 8BITMIME, тогда вы можете попробовать использовать EncodingConstraint.EightBit.

+0

Спасибо, @jsteadfast, что решило нашу проблему !. – Krylor

+0

@jstedfast это важная часть, которая обязательно должна быть включена в документы. Спасибо за отличный ответ! –

+0

Это в REAMDE :) – jstedfast