我在处理电子邮件编码时遇到了一些问题。我正在从磁盘读取HTML文件并通过Gmail发送它。当我在浏览器中打开HTML时,它看起来很好。当我从Visual Studio复制HTML字符串并将其保存为HTML文件时,它看起来很好。但是,当我收到电子邮件时,它包含了一堆无效字符。甚至列表符号也出错了!我确定这是一个编码问题,但该文件已编码为UTF-8,直到转换为RAW并通过Gmail发送之前都很好。
这里是读取存储的HTML并将其转换为通过Gmail发送的地方。(我们使用Mimekit进行转换。)
这封电子邮件最终成为“Content-Type: multipart/mixed”,其中包含两种选择。其中一种是:
下面是处理过程。我们使用OpenXML SDK从docx中读取,然后使用HtmlConverter将文档保存为HTML。稍后,从文件中读取HTML,将其转换为RAW格式并通过GMail API发送。
下面是一些相关的代码片段:
这是使用HtmlConverter保存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发送的地方。(我们使用Mimekit进行转换。)
// 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();
这是我们如何进行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: multipart/mixed”,其中包含两种选择。其中一种是:
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有关吗?