Ich habe Probleme mit der E-Mail-Codierung. Ich lese eine HTML-Datei von der Festplatte und sende sie über Gmail ein. Wenn ich das HTML im Browser öffne, sieht es gut aus. Wenn ich die HTML-Zeichenfolge aus Visual Studio kopieren und als HTML-Datei speichern, sieht es gut aus. Wenn ich die E-Mail erhalte, enthält sie eine Reihe ungültiger Zeichen. Selbst die Listenkugeln sind durcheinander! Ich bin sicher, dass dies ein Problem mit der Kodierung ist, aber die Datei ist als UTF-8 kodiert und sieht gut aus, bis sie in RAW konvertiert und über Google Mail gesendet wird.HTML sieht im Browser OK aus, aber nicht in E-Mail
Hier ist der Prozess. Wir lesen von einem Dokument mit der OpenXML SDK dann verwenden wir die HtmlConverter, um das Dokument als HTML zu speichern. Später wird der HTML-Code aus der Datei eingelesen, in RAW-Formatierung konvertiert und über die GMail API gesendet.
Hier sind einige relevante Code snips:
Dies ist, wo wir unsere HTML-Datei mit HtmlConverter speichern.
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);
Hier lesen wir die gespeicherte HTMl und konvertieren sie für den Versand über Gmail. (Wir verwenden Mimekit für die Konvertierung.)
// 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();
Und das ist, wie wir Base64-Kodierung sind:
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("=", "");
}
Die E-Mail endet als "Content-Type: multipart/mixed" mit zwei Alternativen. Eine davon ist
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
und die andere
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Der sowohl der Klartext und die HTML enthalten Zeichenfolge wie = C3 = A2 = E2 = 82 = AC = E2 = 84 = A2 für einen Apostroph und der HTML-Teil enthält einen HTML-Header, der seltsame "3D" -Zeichen enthält.
Keine dieser Seltsamkeit war in der HTML vor dem Konvertieren zu Base64 und Senden.
Irgendwelche Ideen, was das Problem sein könnte? Hat das etwas mit UTF8 und Mimekit zu tun?
Ich kann deine Frage nicht beantworten, aber es wird mein Vorschlag für Anstrengung. – adv12
Warum ersetzen Sie Teile Ihrer Base64-Zeichenfolge? Ich verstehe nicht, was der Kommentar 'Special 'url-safe" base64 encode "bedeutet. – Equalsk
Haben Sie überprüft, ob die Ausgabe von mimekit mit RFC 2822 auscheckt? Da das ist, was GMail API-Dokumente sagt, es ist erforderlich, wenn Sie mit Raw arbeiten. –