如何使用Excel VBA确保修改后的Outlook邮件保存为HTML格式.msg文件
解决方案
偶发格式回退是Outlook默认的格式优先级机制导致:操作过程中如果触发了纯文本格式相关的调用(比如误操作Body属性、收件人地址存在不支持HTML的格式标记),Outlook会自动将邮件格式切换为纯文本,且SaveAs方法不会主动恢复模板原有格式。
直接在保存前强制指定邮件格式为HTML即可,修正后代码如下:
Dim oOutlookApp As Outlook.Application Dim oItem As Outlook.MailItem Dim tempHTMLBody As String ' 新增临时变量存HTML内容,避免误改 Set oOutlookApp = GetObject(, "Outlook.Application") Set oItem = oOutlookApp.CreateItemFromTemplate(TheTemplateLocation) ' 加载模板后先暂存原始HTML内容 tempHTMLBody = oItem.HTMLBody '''''你的修改操作 '''''注意:所有正文修改都操作tempHTMLBody变量,不要直接改oItem.Body,修改完成后赋值回去 oItem.HTMLBody = tempHTMLBody ' 保存前强制指定格式为HTML oItem.BodyFormat = olFormatHTML oItem.SaveAs SaveToLocation, olMSGUnicode oItem.Close olDiscard Set oItem = Nothing
额外注意事项
- 不要直接操作
MailItem.Body属性,只要调用这个属性读取/写入,Outlook会自动将邮件格式切换为纯文本,所有正文修改都通过HTMLBody属性完成 - 如果使用的是2016及更早版本的Outlook,可在
SaveAs前加一行oItem.Save,如果担心生成草稿,可在保存完本地msg后追加删除草稿的逻辑:Dim draftEntryID As String draftEntryID = oItem.EntryID oItem.SaveAs SaveToLocation, olMSGUnicode oOutlookApp.Session.GetItemFromID(draftEntryID).Delete - 如果修改内容包含插入附件、修改收件人等操作,所有操作完成后再统一赋值
HTMLBody和BodyFormat,避免后续操作触发格式回退
内容的提问来源于stack exchange,提问作者Glasses0425
相关产品推荐
相关产品推荐

