You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:20:23