使用Microsoft Graph API获取收件箱邮件总数不符问题求助
问题分析与解决方案
为什么邮件总数和实际看到的不一致?
你使用的Graph API请求/me/mailFolders/inbox/messages?$count=true默认会统计收件箱文件夹内的所有邮件,包括那些你在Outlook界面中可能看不到的内容:
- 已读但未归档/删除的邮件
- 被标记为已删除但尚未同步到“已删除邮件”文件夹的邮件
- 系统自动生成的隐藏邮件(比如会议邀请的响应邮件)
这就是返回值1520远大于你看到的250,但新邮件进来时总数会正常递增的原因——新邮件确实会被计入总数。
当前方法的缺陷
仅靠收件箱总邮件数判断新邮件并不可靠:
- 如果期间有邮件被删除/归档,总数会减少,新邮件进来时总数可能回到之前的数值,导致漏判
- 无法精准定位哪些是新邮件,只能盲目遍历所有邮件找附件
改进方案
1. 修正邮件总数统计
如果只想统计你在Outlook中看到的“可见”邮件,可以添加过滤条件,排除已删除的邮件:
def get_visible_inbox_count(self): endpoint = '/me/mailFolders/inbox/messages' # 过滤掉已删除的邮件,只统计正常显示的邮件 request_url = f'{endpoint}?$count=true&$filter=isDeleted eq false' inbox_response = self.user_client.get(request_url) return inbox_response.json()['@odata.count']
2. 更可靠的新邮件检测方法
放弃依赖总数,改为记录上次检查的时间戳,每次查询收到时间晚于上次检查时间的邮件:
from datetime import datetime, timezone def get_new_emails(self, last_check_timestamp): endpoint = '/me/mailFolders/inbox/messages' # 格式化时间戳为Graph API要求的ISO 8601格式(带时区) formatted_time = last_check_timestamp.strftime('%Y-%m-%dT%H:%M:%SZ') # 过滤出最新邮件,只获取需要的字段(减少数据传输) request_url = ( f'{endpoint}?$filter=receivedDateTime ge {formatted_time}' '&$orderby=receivedDateTime desc' '&$select=id,subject,attachments' ) response = self.user_client.get(request_url) return response.json().get('value', []) # 使用示例 last_check = datetime.now(timezone.utc) new_emails = self.get_new_emails(last_check) for email in new_emails: # 处理附件下载逻辑 if email.get('attachments'): for attachment in email['attachments']: # 这里添加下载附件的代码,调用Graph API获取附件内容 pass # 更新上次检查时间 last_check = datetime.now(timezone.utc)
这种方法可以精准定位新邮件,不受邮件删除/归档的影响,同时能直接获取邮件的附件信息,更适配你的需求。
内容的提问来源于stack exchange,提问作者Tony Frank
相关产品推荐
相关产品推荐

