Outlook如何识别MSG文件是否已发送?及C#实现MSG转草稿功能问询
如何将已发送/已接收的MSG文件转为可编辑的草稿模式(C#实现)
我之前刚好碰到过一模一样的需求,折腾了好一阵才找到靠谱的解决办法,给你分享两种可行的方案:
方案一:使用Outlook Interop(依赖本地Outlook安装)
这个方案需要用户机器上安装了Outlook,好处是直接调用Outlook本身的逻辑,兼容性最好。
实现步骤:
- 首先在项目里引用
Microsoft.Office.Interop.Outlook(可以通过NuGet安装同名包) - 编写代码读取原MSG文件,修改属性后保存为草稿模式的新文件:
using Microsoft.Office.Interop.Outlook; using System; namespace MsgToDraft { class Program { static void Main(string[] args) { Application outlookApp = new Application(); MailItem mailItem = null; try { // 打开已有的MSG文件 mailItem = outlookApp.Session.OpenSharedItem(@"C:\path\to\your\sent-message.msg") as MailItem; // 关键:设置为未发送状态 mailItem.Sent = false; // 修改邮件类型为普通草稿(已发送邮件的MessageClass是IPM.Note.Sent) mailItem.MessageClass = "IPM.Note"; // 保存为新的草稿MSG文件 mailItem.SaveAs(@"C:\path\to\save\draft-message.msg", OlSaveAsType.olMSG); Console.WriteLine("转换完成!"); } catch (Exception ex) { Console.WriteLine($"出错了:{ex.Message}"); } finally { // 释放COM对象,避免内存泄漏 if (mailItem != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(mailItem); if (outlookApp != null) System.Runtime.InteropServices.Marshal.ReleaseComObject(outlookApp); } } } }
关键说明:
- 设置
Sent = false:这是让Outlook识别为未发送草稿的核心 - 修改
MessageClass:已发送邮件的类是IPM.Note.Sent,改成IPM.Note会让Outlook以普通草稿的方式加载
方案二:使用MsgKit库(无需Outlook依赖)
如果不想依赖用户安装Outlook,可以用开源的MsgKit库,它是纯.NET的MSG文件处理库,不依赖Outlook COM组件。
实现步骤:
- 通过NuGet安装
MsgKit包(建议选择稳定版本) - 编写转换代码:
using MsgKit; using MsgKit.Enums; using System.IO; namespace MsgToDraftWithMsgKit { class Program { static void Main(string[] args) { var sourcePath = @"C:\path\to\your\sent-message.msg"; var targetPath = @"C:\path\to\save\draft-message.msg"; // 读取原MSG文件 using (var msg = new Msg(sourcePath)) { // 移除已发送标记 msg.SetMessageFlags(msg.MessageFlags & ~MsgFlags.MSGFLAG_SENT); // 修改邮件类型为普通草稿 msg.MessageClass = "IPM.Note"; // 保存为新文件 using (var stream = new FileStream(targetPath, FileMode.Create)) { msg.Save(stream); } } Console.WriteLine("转换完成!"); } } }
关键说明:
MsgFlags.MSGFLAG_SENT是标记邮件已发送的标识,移除它后Outlook就会把文件识别为未发送状态- 同样修改
MessageClass为IPM.Note确保编辑权限和发送按钮正常显示
两种方案都测试过,转换后的MSG文件用Outlook打开时,会保留发送按钮,所有字段(收件人、主题、正文等)都可以正常编辑,和直接从草稿箱拖出来的文件效果一致。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

