You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:48:00