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

如何在Outlook Add-in项目中将Microsoft Graph获取的MailMessage保存为Msg格式?

将Microsoft Graph获取的MailMessage保存为.msg格式的方案

首先得明确:Microsoft Graph本身并不直接支持导出为.msg格式——因为.msg是Outlook专属的二进制文件格式,而Graph返回的是标准化的JSON结构邮件数据。不过我们有几种可靠的方案来实现需求,分场景给你说明:

场景1:你的Outlook Add-in运行在桌面客户端(可访问Outlook对象模型)

如果你的Add-in是基于VSTO或者可以调用Outlook桌面的COM对象模型,那这是最直接的方式:

  • 先通过Graph获取的邮件ID,在Outlook里定位到对应的邮件项(比如用Namespace.GetItemFromID()方法)
  • 然后调用Outlook对象模型的MailItem.SaveAs()方法,指定保存格式为olMSG(对应数值3)

示例代码(C#,VSTO场景):

// 假设你已经通过Graph拿到了邮件的EntryId
string messageEntryId = "从Graph获取的邮件EntryId";
Outlook.Application outlookApp = new Outlook.Application();
Outlook.Namespace ns = outlookApp.GetNamespace("MAPI");
Outlook.MailItem mailItem = ns.GetItemFromID(messageEntryId) as Outlook.MailItem;
if (mailItem != null)
{
    mailItem.SaveAs(@"C:\temp\exported_message.msg", Outlook.OlSaveAsType.olMSG);
    Marshal.ReleaseComObject(mailItem);
    Marshal.ReleaseComObject(ns);
}

场景2:Web Add-in或纯后端处理(无法直接访问Outlook桌面对象模型)

这种情况下,你需要借助第三方库来手动构建.msg文件,核心思路是把Graph返回的MailMessage对象的各个属性(主题、收件人、正文、附件等)映射到.msg文件的对应结构里。

推荐的库(分技术栈):

  • .NET技术栈:使用MsgKit(一个开源的.NET库,专门用于创建和读取.msg文件)
    步骤大概是:

    1. 从Graph获取完整的MailMessage数据(包括附件内容,需要单独调用Graph的附件接口下载)
    2. 用MsgKit创建一个新的Message对象,依次填充主题、发件人、收件人、HTML/文本正文
    3. 将下载的附件添加到MsgKit的Message中
    4. 调用Message.Save()方法生成.msg文件

    示例代码片段:

    using MsgKit;
    using MsgKit.Enums;
    
    // 假设已经从Graph获取了mailMessage和下载好的附件列表
    var msg = new Message(
        new Sender("发件人邮箱", "发件人名称"),
        new Representing("发件人邮箱", "发件人名称"),
        mailMessage.Subject
    );
    
    // 添加收件人
    foreach (var toRecipient in mailMessage.ToRecipients)
    {
        msg.Recipients.AddTo(new Recipient(toRecipient.EmailAddress.Address, toRecipient.EmailAddress.Name));
    }
    
    // 设置HTML正文(如果是文本类型就用BodyText)
    if (mailMessage.Body.ContentType == "html")
    {
        msg.BodyHtml = mailMessage.Body.Content;
    }
    else
    {
        msg.BodyText = mailMessage.Body.Content;
    }
    
    // 添加附件
    foreach (var attachment in downloadedAttachments)
    {
        msg.Attachments.Add(new Attachment(attachment.Name, attachment.ContentBytes));
    }
    
    // 保存为.msg文件
    msg.Save(@"C:\temp\exported_msg.msg");
    
  • Node.js技术栈:可以使用msgwriter或者outlook-msg-file这类库,思路和.NET类似,把Graph的数据映射到库的对应API中完成.msg文件生成。

注意事项

  • 如果你是在Web Add-in中处理,由于浏览器的安全限制,无法直接生成本地文件,通常需要把Graph数据传给后端服务,由后端用第三方库生成.msg后再返回给前端下载。
  • 处理邮件正文时,要注意Graph返回的Body.ContentType(可能是HTML或Text),确保对应的库支持对应格式的正文写入。
  • 附件需要单独通过Graph的/messages/{id}/attachments/{id}/$value接口下载原始内容,再嵌入到.msg文件中。

内容的提问来源于stack exchange,提问作者MVPKenLin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:54:13