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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:45:29