如何通过Microsoft Graph API获取邮件投递/打开/退回状态并触发通知?
Microsoft Graph API邮件状态跟踪方案
1. 用Webhook订阅接收状态变更通知
Graph API支持通过订阅机制触发自定义端点,实时获取邮件状态变化:
- 对于已发送邮件的投递/状态更新:订阅
/me/mailFolders('SentItems')/messages的updated事件,当邮件的deliveryStatus等状态字段变化时,会自动向你配置的notificationUrl发送通知。 - 对于未送达报告(NDR):NDR是系统推送到收件箱的邮件,你可以订阅
/me/mailFolders('Inbox')/messages的created事件,然后在自定义端点里过滤主题含"Undeliverable"(或对应语言的退回关键词)的邮件,以此捕获退回通知。 - 配置订阅的核心请求示例:
注意:你的自定义端点必须能处理Graph的初始验证请求(返回请求中的POST /subscriptions { "changeType": "updated", "notificationUrl": "https://your-custom-endpoint.com/webhook", "resource": "/me/mailFolders('SentItems')/messages", "expirationDateTime": "2024-12-31T00:00:00Z", "clientState": "your-secret-token" }validationToken),否则订阅创建会失败。
2. 通过API主动查询状态与报告
- 查询单封邮件的投递状态:调用
GET /me/mailFolders('SentItems')/messages/{message-id},返回结果的internetMessageHeaders里包含投递相关的元数据,比如X-MS-Exchange-Organization-Delivery-Report;部分场景下deliveryStatus字段也会直接显示投递状态。 - 获取未送达报告:直接查询收件箱中系统发送的NDR邮件,示例请求:
拿到NDR邮件后,解析正文或GET /me/messages?$filter=subject contains 'Undeliverable' and from/emailAddress/address eq 'postmaster@outlook.com'internetMessageHeaders里的X-Failed-Recipients、Diagnostic-Code等字段,就能获取具体的退回原因。
3. 批量邮件跟踪(需管理员权限)
如果是批量发送邮件,还可以用Exchange管理员权限调用邮件跟踪日志API:
GET /admin/microsoft/Exchange/mailTracking/mailTrackingEvents?$filter=senderAddress eq 'your-email@domain.com' and eventDateTime ge 2024-01-01T00:00:00Z
这个API能返回投递、打开、退回等全流程的事件日志,适合批量场景的跟踪需求。
内容的提问来源于stack exchange,提问作者Андрей Смольков
相关产品推荐
相关产品推荐

