如何通过Graph API识别并下载刚发送的邮件?
解决Graph API发送邮件后定位已发送副本的问题
核心问题说明
SendMail接口本身不会返回已发送邮件的ID,所以得靠自定义标识或精准检索条件来定位。你之前加自定义标识没生效,大概率是属性定义或过滤逻辑有问题,下面给你靠谱的实现步骤:
方法一:发送时添加可检索的自定义扩展属性
发送邮件时,在请求体里加入单值旧版扩展属性(SingleValueLegacyExtendedProperty),这是Graph API中支持过滤的自定义标识方式:
发送邮件的请求体示例
{ "message": { "subject": "测试邮件", "body": { "contentType": "Text", "content": "这是测试内容" }, "toRecipients": [ { "emailAddress": { "address": "recipient@example.com" } } ], "singleValueExtendedProperties": [ { "id": "String {00020329-0000-0000-C000-000000000046} Name MyCustomMessageId", "value": "你的唯一自定义ID(比如UUID)" } ] }, "saveToSentItems": true }
- 必须设置
saveToSentItems: true,确保邮件存到已发送文件夹 - 自定义属性的
id格式是固定的:String {GUID} Name 属性名,这里用的是通用旧版属性GUID,保证支持过滤检索
发送后检索该邮件
发送成功后,调用GET /me/mailFolders('SentItems')/messages,用自定义属性过滤:
GET /me/mailFolders('SentItems')/messages?$filter=singleValueExtendedProperties/any(ep: ep/id eq 'String {00020329-0000-0000-C000-000000000046} Name MyCustomMessageId' and ep/value eq '你的唯一自定义ID')
拿到邮件ID后,即可调用GET /me/messages/{邮件ID}/$value下载邮件。
方法二:用时间+主题+收件人组合过滤(备选)
如果自定义属性还是有问题,可通过发送时间窗口+主题+收件人缩小范围:
GET /me/mailFolders('SentItems')/messages?$filter=receivedDateTime ge 2024-05-20T10:00:00Z and receivedDateTime le 2024-05-20T10:05:00Z and subject eq '测试邮件' and toRecipients/any(r: r/emailAddress/address eq 'recipient@example.com')&$orderby=receivedDateTime desc&$top=1
- 时间窗口设为发送后的几分钟内,保证结果唯一
- 用
$orderby=receivedDateTime desc+$top=1直接取最新匹配的邮件
为什么之前的自定义标识没生效?
常见坑点:
- 用了不支持过滤的扩展属性类型(比如
extensions开放扩展,无法用$filter检索) - 自定义属性的
id格式写错,导致匹配失败 - 发送时未设置
saveToSentItems: true,邮件根本没存入已发送文件夹
内容的提问来源于stack exchange,提问作者BeatsC
相关产品推荐
相关产品推荐

