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

Outlook如何识别MSG文件是否已发送?及C#实现MSG转草稿功能问询

如何将已发送/已接收的MSG文件转为可编辑的草稿模式(C#实现)

我之前刚好碰到过一模一样的需求,折腾了好一阵才找到靠谱的解决办法,给你分享两种可行的方案:

方案一:使用Outlook Interop(依赖本地Outlook安装)

这个方案需要用户机器上安装了Outlook,好处是直接调用Outlook本身的逻辑,兼容性最好。

实现步骤:

  1. 首先在项目里引用Microsoft.Office.Interop.Outlook(可以通过NuGet安装同名包)
  2. 编写代码读取原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组件。

实现步骤:

  1. 通过NuGet安装MsgKit包(建议选择稳定版本)
  2. 编写转换代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:39:19