GemBox Word转邮件时£符号变问号,如何设置UTF-8且不破坏模板?
解决GemBox Word转Email时£符号变问号且模板损坏的问题
核心原因
Outlook对MHTML格式的UTF-8编码兼容性较差,直接设置Encoding.UTF8会破坏邮件模板结构;而默认编码未正确映射£符号,导致出现问号乱码。
可行解决方案
方案1:使用Windows-1252编码(推荐,完美兼容Outlook)
Windows-1252编码原生支持£符号,且Outlook对该编码的MHTML解析稳定性高,不会损坏原有模板结构。修改代码如下:
GemBox.Document.ComponentInfo.SetLicense(this.GemBoxDocumentLisense); GemBox.Email.ComponentInfo.SetLicense(this.GemBoxEmailLisense); var document = DocumentModel.Load(documentPath); using (MemoryStream gemBoxOutput = new MemoryStream()) { document.Save(gemBoxOutput, new GemBox.Document.HtmlSaveOptions() { HtmlType = GemBox.Document.HtmlType.Mhtml, UseContentIdHeaders = true, Encoding = Encoding.GetEncoding(1252) // 替换为Windows-1252编码 }); // 重置流指针至起始位置,避免加载失败 gemBoxOutput.Position = 0; MailMessage.Load(gemBoxOutput, MailMessageFormat.Mhtml); }
方案2:强制UTF-8编码并修复字符集声明(需验证兼容性)
若业务要求必须使用UTF-8,需手动为MHTML添加字符集声明,确保Outlook能正确识别编码:
GemBox.Document.ComponentInfo.SetLicense(this.GemBoxDocumentLisense); GemBox.Email.ComponentInfo.SetLicense(this.GemBoxEmailLisense); var document = DocumentModel.Load(documentPath); using (MemoryStream gemBoxOutput = new MemoryStream()) { document.Save(gemBoxOutput, new GemBox.Document.HtmlSaveOptions() { HtmlType = GemBox.Document.HtmlType.Mhtml, UseContentIdHeaders = true, Encoding = Encoding.UTF8 }); // 读取MHTML内容并添加UTF-8字符集声明 gemBoxOutput.Position = 0; string mhtmlContent = new StreamReader(gemBoxOutput).ReadToEnd(); mhtmlContent = mhtmlContent.Replace("Content-Type: text/html", "Content-Type: text/html; charset=utf-8"); // 重新写入流并加载邮件 using (MemoryStream correctedStream = new MemoryStream(Encoding.UTF8.GetBytes(mhtmlContent))) { MailMessage.Load(correctedStream, MailMessageFormat.Mhtml); } }
关键注意事项
- 调用
MailMessage.Load前必须重置流位置(gemBoxOutput.Position = 0),否则会因流指针在末尾导致加载失败。 - 优先选择Windows-1252编码,可最大程度避免Outlook出现布局错乱或加载异常问题。
内容的提问来源于stack exchange,提问作者Bilal lilla
相关产品推荐
相关产品推荐

