如何在Graph API中区分已发送与已接收的邮件消息
基于Graph API区分已发送/已接收邮件的实现方案
方案1:通过邮件固有属性直接判断(支持全量邮件分类)
不需要限定查询范围,直接通过邮件核心字段匹配即可完成分类:
- 已发送邮件判断:
sender字段对应的邮箱地址属于当前认证账号的邮箱别名列表,同时isDraft字段为false。如果是共享邮箱场景,额外校验from字段和当前操作邮箱的归属关系即可。 - 已接收邮件判断:
toRecipients、ccRecipients、bccRecipients三个字段中至少有一个包含当前认证账号的邮箱地址,同时该邮件不属于已发送、草稿、垃圾邮件、已删除等特殊分类。
如果是企业域内多别名账号,需要先拉取当前账号的所有邮箱别名做匹配,避免漏判发送给自己的测试邮件这类特殊场景
方案2:通过限定查询文件夹范围直接分类(实现更简单,性能更高)
直接调用对应系统文件夹的查询接口,返回结果天然符合分类要求,是绝大多数场景的最优选择:
- 查询已发送邮件:直接调用
/me/mailFolders('sentItems')/messages接口,返回的所有结果都是原生已发送邮件 - 查询已接收邮件:直接调用
/me/mailFolders('inbox')/messages接口,返回的所有结果都是收件箱内的已接收邮件;如果需要包含所有归档的已接收邮件,可以排除sentItems、drafts、junkemail、deleteditems四个系统文件夹后查询所有邮件
接口调用示例
HTTP请求示例:
# 已发送邮件查询请求 GET https://graph.microsoft.com/v1.0/me/mailFolders('sentItems')/messages # 已接收邮件查询请求 GET https://graph.microsoft.com/v1.0/me/mailFolders('inbox')/messages
C# Graph SDK调用示例:
// 查询已发送邮件 var sentMessages = await graphClient.Me.MailFolders["sentItems"].Messages .Request() .GetAsync(); // 查询收件箱已接收邮件 var receivedMessages = await graphClient.Me.MailFolders["inbox"].Messages .Request() .GetAsync();
方案2适合绝大多数常规业务场景,实现成本最低,查询速度最快;如果你的业务需要自定义分类逻辑,比如把用户自己移到自定义文件夹的邮件也做分类,再用方案1的属性判断逻辑即可。
内容的提问来源于stack exchange,提问作者Susi_003
相关产品推荐
相关产品推荐

