Microsoft Graph API返回重复邮件问题求助(Outlook收件箱仅1封邮件)
一、UUID差异的本质
你看到的UUID是邮件的版本标识符(对应Graph API中的changeKey字段)。Exchange/Outlook会为邮件的每一次状态变更(比如转发、移动文件夹、标记已读/未读、修改属性)生成新的版本ID,末尾的字符差异就是不同版本的区分标识。这些记录是同一封邮件的历史版本快照,后台保留用于同步、数据恢复等功能,但Outlook客户端会做聚合处理,只展示用户可见的当前版本。
二、API返回多条结果的原因
默认情况下,Microsoft Graph API的/messages端点会返回目标文件夹内邮件的所有版本记录,而Outlook网页版/客户端会自动合并同一邮件的不同版本,只显示最终的活跃条目,这就是你看到数量差异的核心原因。
三、解决方案:获取与Outlook一致的单条结果
方法1:过滤当前活跃版本
直接通过isCurrentVersion属性筛选,该属性标记了版本是否为邮件的当前活跃状态,修改你的请求端点即可:
endpoint = f'https://graph.microsoft.com/v1.0/users/{user}/mailFolders/{src_folder_param[0]["id"]}/messages?$top=100&$filter=isCurrentVersion eq true'
方法2:按全局邮件ID去重(备选)
同一邮件的所有版本共享internetMessageId(全局唯一邮件标识),你也可以通过该字段分组后取最新版本,不过方法1更高效直接。
另外注意:你使用的密码授权流(Resource Owner Password Credentials)属于不安全的认证方式,微软已逐步限制其使用,生产环境建议改用授权码流(Authorization Code Flow)。
验证方式
可以打印每条邮件的internetMessageId和isCurrentVersion字段,你会发现61条记录的internetMessageId完全相同,只有isCurrentVersion为true的那条是Outlook网页版显示的邮件。
内容的提问来源于stack exchange,提问作者A. L

