如何在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文件)
步骤大概是:- 从Graph获取完整的MailMessage数据(包括附件内容,需要单独调用Graph的附件接口下载)
- 用MsgKit创建一个新的
Message对象,依次填充主题、发件人、收件人、HTML/文本正文 - 将下载的附件添加到MsgKit的
Message中 - 调用
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
相关产品推荐
相关产品推荐

