Office.js开发Outlook插件:获取刚发送邮件的ItemId方案咨询
解决方案:Outlook发送新邮件后自动获取邮件标识同步到API
一、通过OnMessageSend设置自定义属性,再用Graph查询匹配
你可以借助OnMessageSend事件在邮件发送前设置唯一自定义属性,之后通过Graph在已发送文件夹中精准定位目标邮件:
- 发送前添加自定义属性
在OnMessageSend的处理逻辑里,给待发送邮件生成一个唯一标识(比如UUID)并绑定为自定义属性:
Office.context.mailbox.item.customproperties.setAsync( { "SyncMarker": "生成的唯一UUID" }, function (asyncResult) { if (asyncResult.status === Office.AsyncResultStatus.Succeeded) { asyncResult.completed({ allowEvent: true }); // 允许邮件发送 } else { asyncResult.completed({ allowEvent: false }); // 设置失败时阻止发送 } } );
注意:OnMessageSend是同步事件,必须在Outlook规定的时间窗口内完成操作并调用completed,否则会被拦截。
- 发送后通过Graph匹配属性查询邮件
邮件发送完成后,你的API可以调用Graph接口,通过自定义属性筛选已发送文件夹中的目标邮件:
GET https://graph.microsoft.com/v1.0/me/mailFolders/sentitems/messages?$filter=singleValueExtendedProperties/any(ep: ep/id eq 'String {00020329-0000-0000-C000-000000000046} Name SyncMarker' and ep/value eq '之前生成的UUID')
查询到邮件后即可获取其id,完成后续的信息存储操作。
二、扫描已发送文件夹获取最新邮件
如果不想依赖自定义属性,也可以在邮件发送后,通过Graph拉取已发送文件夹中最新的邮件:
触发时机
在OnMessageSend中允许邮件发送后,启动一个异步任务(比如用setTimeout延迟3-5秒,给Outlook同步到已发送文件夹的时间),避免在同步回调中执行耗时操作导致超时。Graph查询最新邮件
调用接口获取已发送文件夹中按发送时间倒序的第一封邮件:
GET https://graph.microsoft.com/v1.0/me/mailFolders/sentitems/messages?$top=1&$orderby=sentDateTime desc&$select=id,subject,sentDateTime
这种方法的局限性是:若用户短时间内连续发送多封邮件,可能会匹配错误,建议结合邮件主题、发送时间做二次校验。
关键注意事项
- 权限配置:确保插件和API拥有
Mail.ReadWrite的Graph权限,才能访问已发送文件夹并读取邮件详情。 - 异步处理:所有涉及外部API调用的逻辑都要放在异步任务中,不要占用
OnMessageSend的同步回调时间窗口。 - 标识唯一性:使用UUID作为自定义属性值,避免和其他邮件的属性冲突,保证查询准确性。
内容的提问来源于stack exchange,提问作者Simon Hill
相关产品推荐
相关产品推荐

