基于Yeoman的Outlook加载项:如何生成.msg/.eml邮件文件?
解决方案:获取/生成Outlook邮件的.msg/.eml文件
一、服务器端直接生成(优先推荐)
1. 通过Outlook v2 API获取.eml文件
你当前在用的Outlook v2 API支持直接拉取邮件的MIME内容,这就是标准的.eml格式。请求时先通过$select=Id,InternetMessageId拿到邮件ID,再调用/messages/{id}/$value端点获取原始二进制数据,直接写入磁盘就是合法的.eml文件。
示例请求(服务器端):
GET https://outlook.office.com/api/v2.0/me/messages/{message-id}/$value Authorization: Bearer {your-access-token}
2. 从.eml转换为.msg格式
.msg是Outlook专用二进制格式,没有原生API直接生成,可借助第三方工具转换:
- .NET环境:用
Microsoft.Office.Interop.Outlook或MsgReader库加载.eml后保存为.msg - Python环境:用
msg-extractor或依赖本地Outlook客户端的pywin32转换 - Node.js环境:用
msgparser或调用第三方转换服务
3. 迁移到Graph API的令牌解决方案
要获取Graph API兼容的令牌,需调整加载项配置:
- 在
manifest.xml里把权限范围从Outlook API的Mail.Read等替换为Graph API的对应权限(如Mail.ReadWrite) - 使用
Office.context.auth.getAccessTokenAsync获取Graph令牌,前提是加载项配置了对应权限且用户完成授权 - 之后通过Graph API的
/me/messages/{id}/$value端点获取邮件MIME内容,逻辑和Outlook API一致,但Graph是官方长期支持的方案
注意:Office.context.mailbox.restUrl返回Outlook API地址是因为加载项默认配置了Outlook权限,切换到Graph权限后直接用固定端点https://graph.microsoft.com/v1.0即可,无需依赖该属性。
二、客户端生成后上传
Outlook.js无法直接获取邮件原始MIME内容,可通过间接方式实现:
- 调用
Office.context.mailbox.item.saveAsync将邮件临时保存到用户Outlook文件夹 - 服务器端通过API拉取该邮件的MIME内容
- 完成后删除临时保存的邮件
这种方式需要额外权限和操作步骤,效率不如服务器端直接获取。
总结:优先用服务器端API获取MIME内容生成.eml,再转.msg;同时建议迁移到Graph API,用getAccessTokenAsync解决令牌兼容问题,规避Outlook API弃用风险。
内容的提问来源于stack exchange,提问作者Simon Hill
相关产品推荐
相关产品推荐

