2017-01-31 42 views
2

DKIMがメールキット&でヘッダーに署名する際に奇妙な問題が発生しましたMimekit、Gmailは「dkim = neutral確認する)」。ボディハッシュで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

私は、ここの問題が何であるか知っていると思います。私がHtmlBodyでUtf-8文字を使用しているという事実は、DKIMの署名が失敗する原因になります。標準のAsciiチャッカーに置き換えれば、うまく動作し、飛行色でテストに合格します。 – Krylor

答えて

2

問題は、DKIMがメッセージに署名する前にmessage.Prepare()に電話していないことです。これは非常に重要なステップです。これは、メッセージ本体のすべてのMIME部分を適切なエンコーディングに転送して転送するためです。あなたは適切なエンコーディング制約値でPrepare()を呼び出さない場合は、SmtpClient.Send()方法は後あなたはDKIMは、このように署名を無効、メッセージに署名したことをやってしまうこと

は注意してください。

私の提案は、最大の相互運用性のためにEncodingConstraint.SevenBitを使用することです。

ただし、メッセージを転送するSMTPサーバーと他のすべてのSMTPサーバーが8BITMIMEの拡張子をサポートしていると確信している場合は、代わりにEncodingConstraint.EightBitを試してみてください。

+0

ありがとう、私の問題を解決しました! – Krylor

+0

@jstedfastこれは確かにドキュメントに含まれるべき重要な部分です。素晴らしい答えをありがとう! –

+0

それはREAMDEにあります:) – jstedfast

関連する問題