メールのエンコードに問題があります。私は、ディスクから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と関係がありますか?
私はあなたの質問に答えることはできませんが、努力のために私のupvoteを取得します。 – adv12
Base64文字列の一部を置き換えるのはなぜですか?私は、「特別な」url-safe「base64 encode」というコメントの意味を理解していません。 – Equalsk
mimekitの出力がRFC 2822でチェックアウトしているかどうかを確認しましたか?それ以来、GMail APIのドキュメントにはRawと一緒に作業する場合に必要なことが書かれています。 –