2017-05-05 5 views
3

メールのエンコードに問題があります。私は、ディスクからHTMLファイルを読んでいて、Gmailを通して送信しています。私はブラウザでHTMLを開くと素晴らしいです。 Visual StudioからHTML文字列をコピーしてHTMLファイルとして保存すると、すばらしく見えます。電子メールを受信すると、無効な文字がたくさん含まれています。リストの箇条書きでさえもうんざりです!私はこれがエンコーディングの問題であると確信していますが、ファイルはUTF-8としてエンコードされていて、RAWに変換されてGmailに送信されるまで見栄えがよくなります。ブラウザではHTMLは大丈夫ですがメールでは表示されません

ここにプロセスがあります。 OpenXML SDKを使用してdocxから読み込み、HtmlConverterを使用してドキュメントをHTMLとして保存します。その後、HTMLがファイルから読み込まれ、RAW書式に変換され、GMail APIを介して送信されます。ここで

は、いくつかの関連するコードは切れ端です:

我々はHTMLコンバータを使用して、当社のHTMLファイルを保存する場所です。

HtmlConverterSettings settings = new HtmlConverterSettings() 
{ 
    AdditionalCss = "body { margin: 1cm auto; max-width: 20cm; padding: 0; }", 
    FabricateCssClasses = true, 
    RestrictToSupportedLanguages = false, 
    RestrictToSupportedNumberingFormats = false, 
}; 

XElement htmlElement = HtmlConverter.ConvertToHtml(wdWordDocument, settings); 
var html = new XDocument(
    new XDocumentType("html", null, null, null), 
    htmlElement); 

var htmlString = html.ToString(SaveOptions.DisableFormatting); 
File.WriteAllText(destFileName.FullName, htmlString, Encoding.UTF8); 

ここでは、保存されたHTMlを読み込み、Gmail経由で送信するために変換します。

// Create the message using MimeKit/System.Net.Mail.MailMessage 
MailMessage msg = new MailMessage(); 
msg.Subject = strEmailSubject; // Subject 
msg.From = new MailAddress(strUserEmail); // Sender 
msg.To.Add(new MailAddress(row.email)); // Recipient 
msg.BodyEncoding = Encoding.UTF8; 
msg.IsBodyHtml = true; 

// We need to loop through our HTML Document and replace the images with a CID so that they will display inline 
var vHtmlDoc = new HtmlAgilityPack.HtmlDocument(); 
vHtmlDoc.Load(row.file); // Read the body, from HTML file 
... 
msg.Body = vHtmlDoc.DocumentNode.OuterHtml; 

// Convert our System.Net.Mail.MailMessage to RAW with Base64 encoding for Gmail 
MimeMessage mimeMessage = MimeMessage.CreateFromMailMessage(msg); 

Google.Apis.Gmail.v1.Data.Message message = new Google.Apis.Gmail.v1.Data.Message(); 
message.Raw = Base64UrlEncode(mimeMessage.ToString()); 
var result = vGMailService.Users.Messages.Send(message, "me").Execute(); 

(。私たちは、変換のためにMimekitを使用)そして、これは我々がbase64でエンコードされている方法です。

private static string Base64UrlEncode(string input) 
{ 
var inputBytes = System.Text.Encoding.UTF8.GetBytes(input); 
// Special "url-safe" base64 encode. 
return Convert.ToBase64String(inputBytes) 
        .Replace('+', '-') 
        .Replace('/', '_') 
        .Replace("=", ""); 
} 

電子メールは、「コンテンツタイプ:混合/マルチパート」として終わる二つの選択肢を持ちます。一つは

Content-Type: text/plain; charset=UTF-8 
Content-Transfer-Encoding: quoted-printable 

あり、他方は

Content-Type: text/html; charset=UTF-8 
Content-Transfer-Encoding: quoted-printable 

プレーンテキストの両方とHTMLは、アポストロフィのために= C3 = A2 = E2 = 82 = AC = E2 = 84 = A2のような文字列が含まれていますHTML部分には、奇妙な「3D」文字を含むHTMLヘッダーが含まれています。

<meta charset=3D"UTF-8"><title></title><meta name=3D"Generator"= 
content=3D"PowerTools for Open XML"> 

この奇妙なことは、Base64に変換して送信する前にHTMLにはありませんでした。

どのような問題が発生する可能性がありますか?これはUTF8とMimekitと関係がありますか?

+0

私はあなたの質問に答えることはできませんが、努力のために私のupvoteを取得します。 – adv12

+0

Base64文字列の一部を置き換えるのはなぜですか?私は、「特別な」url-safe「base64 encode」というコメントの意味を理解していません。 – Equalsk

+0

mimekitの出力がRFC 2822でチェックアウトしているかどうかを確認しましたか?それ以来、GMail APIのドキュメントにはRawと一緒に作業する場合に必要なことが書かれています。 –

答えて

0

これはあなたのコードは、GoogleのAPIのを使用するため、「生」のメッセージデータを取得するためにどのように見えるかです:

using (var stream = new MemoryStream()) { 
    message.WriteTo (stream); 

    var buffer = stream.ToArray(); 
    var base64 = Convert.ToBase64String (buffer) 
     .Replace('+', '-') 
     .Replace('/', '_') 
     .Replace("=", ""); 

    message.Raw = base64; 
} 

brandon927が指摘したように、テキスト/ HTMLのMIMEパートの内容が引用されています印刷可能なエンコード。これは、トランスポートに使用されるMIMEエンコーディングで、7ビットのASCII範囲内に収まることを確認します。

元のHTMLを取得するには、これをデコードする必要があります。

はMimeKitでは、これはあなたがmimeMessage.HtmlBodyを使用するかどうかのために行われたり、TextPartにtext/htmlの部分を表すMimeEntityをキャストした場合Textプロパティにアクセスされます。

+0

どうもありがとうございました!この先週、私は何時間も過ごしました。私は 'message.Raw = Base64UrlEncode(mimeMessage.ToString())'という行をあなたのコードに置き換え、Gmailと私の電子メールクライアントで電子メールが正しく表示されるようになりました。私はおそらくこれを考え出したことはないでしょう。 :) – mack

+0

素晴らしい、あなたのために働いてうれしい:) – jstedfast

0

ご質問に対する回答は問題ありません。これは単純にRawがどのように提示されているかを示しており、quoted-printableエンコーディングを使用しています。 Gmailを送信して電子メールで送信元を確認すると、これもGmailで表示されます。

+0

ありがとう@ brandon927それで、メールでテキストを正しく表示させるにはどうすればいいですか? – mack

関連する問題