Microsoft Graph API过滤邮件返回无效JSON问题咨询
Microsoft Graph API 获取邮件时响应混入 ErrorItemNotFound 错误的问题
问题详情
调用Microsoft Graph API获取指定时间范围内修改的非草稿邮件(排除特定文件夹),请求URL如下:
https://graph.microsoft.com/v1.0/users/59687355-748d-4d9c-aa4c-d0c1d2086eff/messages/?$select=bccRecipients,categories,ccRecipients,changeKey,conversationId,conversationIndex,createdDateTime,flag,from,hasAttachments,id,importance,inferenceClassification,internetMessageId,isDeliveryReceiptRequested,isRead,isReadReceiptRequested,lastModifiedDateTime,parentFolderId,receivedDateTime,replyTo,sender,sentDateTime,subject,toRecipients,webLink&$filter=lastModifiedDateTime gt 2022-10-07T10:49:27Z and lastModifiedDateTime lt 2022-10-14T10:49:27Z and isDraft eq false and parentFolderId ne 'conversationhistory' and parentFolderId ne 'junkemail' and parentFolderId ne 'outbox' and parentFolderId ne 'recoverableitemsdeletions' and parentFolderId ne 'scheduled' and parentFolderId ne 'searchfolders'&$orderby=lastModifiedDateTime asc&$top=100
多数请求成功,但偶尔会返回格式异常的响应——在value数组中混入错误条目:
{ "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('59687355-748d-4d9c-aa4c-d0c1d2086eff')/messages(bccRecipients,categories,ccRecipients,changeKey,conversationId,conversationIndex,createdDateTime,flag,from,hasAttachments,id,importance,inferenceClassification,internetMessageId,isDeliveryReceiptRequested,isRead,isReadReceiptRequested,lastModifiedDateTime,parentFolderId,receivedDateTime,replyTo,sender,sentDateTime,subject,toRecipients,webLink)", "value": [ { "@odata.etag": "W/\"CQAAABYAAABsk7XI0Ba5RLTZiPmnkZbZAAFYXkB3\"", "id": "AAMkADg5NjZhMjkzLWIyODQtNDFkNy1hOWMzLTBhODVlZGFjMGIyMQBGAAAAAADk-kLFG1rtR5MSTyO-jKygBwBsk7XI0Ba5RLTZiPmnkZbZAAAAAAEJAABsk7XI0Ba5RLTZiPmnkZbZAAFZu3S4AAA=", ... }, { "@odata.etag": "W/\"CQAAABYAAABsk7XI0Ba5RLTZiPmnkZbZAAFYXkCB\"", "id": "AAMkADg5NjZhMjkzLWIyODQtNDFkNy1hOWMzLTBhODVlZGFjMGIyMQBGAAAAAADk-kLFG1rtR5MSTyO-jKygBwBsk7XI0Ba5RLTZiPmnkZbZAAAAAAEKAABsk7XI0Ba5RLTZiPmnkZbZAAFZuvoVAAA=", ... }, { "@odata.etag": "W/\"CQAAABYAAABsk7XI0Ba5RLTZiPmnkZbZAAFYXkCJ\"", "id": "AAMkADg5NjZhMjkzLWIyODQtNDFkNy1hOWMzLTBhODVlZGFjMGIyMQBGAAAAAADk-kLFG1rtR5MSTyO-jKygBwBsk7XI0Ba5RLTZiPmnkZbZAAAAAAEKAABsk7XI0Ba5RLTZiPmnkZbZAAFZuvoWAAA=", ... }, { "error": { "code": "ErrorItemNotFound", "message": "The specified object was not found in the store., The process failed to get the correct properties." } } ] }
重试请求通常能解决问题,推测原因是Graph API先获取匹配查询的ID列表,再逐个获取记录组装响应,期间邮件可能被移动、删除或ID变更,导致无法找到对应条目,错误被混入响应中。
解决方案
临时处理方案
- 实现重试机制:针对此类包含错误条目的响应,触发指数退避重试(比如最多重试3次,每次间隔1s、2s、4s),利用重试后数据一致性恢复的特性解决问题。
- 客户端过滤错误条目:在解析响应时,遍历
value数组,过滤掉包含error字段的条目,只处理正常的邮件数据,避免格式错误影响业务逻辑。 - 缩小单次查询范围:减小
$top参数的值(比如从100改为50),减少单次请求处理的邮件数量;或者拆分时间范围,分多次请求获取数据,降低出现一致性问题的概率。
长期优化与官方支持
- 使用Delta查询:改用
/users/{id}/messages/delta端点跟踪邮件变更,Delta查询专门用于增量获取资源变更,能自动处理资源移动、删除等场景,从根源减少此类一致性问题。 - 提交官方支持工单:如果问题频繁出现,收集请求ID、响应时间、错误详情等信息,提交给微软技术支持,确认是否为已知Bug,推动官方修复。
内容的提问来源于stack exchange,提问作者glevine
相关产品推荐
相关产品推荐

