Outlook 2019中使用.NET C#处理HTML格式.msg邮件后正文格式自动转为纯文本的问题
Outlook 2019中使用.NET C#处理HTML格式.msg邮件后正文格式自动转为纯文本的问题
我之前也碰到过Outlook 2019这个特有的兼容性问题——明明用代码处理时还保持着HTML格式,手动打开Outlook后草稿里的邮件就变成纯文本了,2016及更早版本都没这事儿。结合你的代码和场景,我来分析下原因和解决办法:
问题根源
Outlook 2019在MAPI层对通过CreateItemFromTemplate创建的邮件,格式保留逻辑做了改动。当你通过代码释放COM对象并退出Outlook后,客户端重新加载草稿箱邮件时,会错误地触发格式转换,把HTML转为纯文本。
可行解决方案
1. 改用Namespace.OpenSharedItem加载.msg文件
相比CreateItemFromTemplate,这个方法在Outlook 2019中对HTML格式的支持更稳定,能减少格式丢失的概率。同时显式强制设置BodyFormat并刷新HTMLBody属性,确保格式被正确保存。
修改后的代码示例:
using Debug = System.Diagnostics.Debug; using Outlook = Microsoft.Office.Interop.Outlook; static void CreateMailFixed() { Outlook.Application app = new Outlook.Application(); Outlook.NameSpace nms = app.GetNamespace("MAPI"); // 使用OpenSharedItem替代CreateItemFromTemplate,提升Outlook 2019下的格式稳定性 Outlook.MailItem mail = nms.OpenSharedItem(@"C:\html_message.msg") as Outlook.MailItem; mail.Recipients.Add("johndoe@foobar.com"); // 显式强制设置正文格式为HTML mail.BodyFormat = Outlook.OlBodyFormat.olFormatHTML; // 重新赋值HTMLBody触发属性同步,确保格式被正确记录 mail.HTMLBody = mail.HTMLBody; Debug.WriteLine(mail.BodyFormat.ToString()); // 输出:olFormatHTML mail.Save(); mail.Close(Outlook.OlInspectorClose.olDiscard); // 验证保存后的格式 Outlook.MAPIFolder DraftFolder = nms.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderDrafts); mail = DraftFolder.Items[1] as Outlook.MailItem; Debug.WriteLine(mail.BodyFormat.ToString()); // 输出:olFormatHTML // 正确清理COM对象,避免残留引用导致异常 mail.Close(Outlook.OlInspectorClose.olDiscard); System.Runtime.InteropServices.Marshal.ReleaseComObject(mail); System.Runtime.InteropServices.Marshal.ReleaseComObject(DraftFolder); System.Runtime.InteropServices.Marshal.ReleaseComObject(nms); app.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); }
2. 确保安装Outlook 2019最新补丁
微软后续可能针对这类格式转换Bug发布过修复补丁,建议检查并安装Office 2019的最新更新,很多兼容性问题都能通过更新解决。
3. 保存后再次强制设置格式并二次保存
如果坚持用CreateItemFromTemplate,可以在第一次保存后,重新打开邮件,再次设置BodyFormat为HTML并保存,双重确保格式不会丢失:
// 第一次保存后 mail.Save(); mail.Close(Outlook.OlInspectorClose.olDiscard); // 重新打开邮件并二次设置格式 mail = DraftFolder.Items[1] as Outlook.MailItem; mail.BodyFormat = Outlook.OlBodyFormat.olFormatHTML; mail.Save(); mail.Close(Outlook.OlInspectorClose.olDiscard);
验证方法
运行修改后的CreateMailFixed后,再执行你的PrintBodyFormat方法,就能看到Outlook 2019下正文格式依然保持olFormatHTML了。
备注:内容来源于stack exchange,提问作者mixmox75
相关产品推荐
相关产品推荐

