ExchangeLib访问归档文件夹报错:ErrorItemNotFound对象无id属性
问题根因
你遇到的是exchangelib 4.0版本的已知兼容性问题:
- 归档文件夹中经常存在索引残留、已被后台清理、或用户权限不足无法访问的邮件条目,调用EWS接口查询时会返回
ErrorItemNotFound类型的错误对象 - 4.0版本的框架没有对这类错误对象做前置校验,在生成请求ID的环节直接读取
id属性,最终抛出属性不存在的异常
解决方案
方案1:升级exchangelib版本(最优先)
该问题在exchangelib 4.1.0及之后的稳定版本已被官方修复,框架会自动过滤查询结果中的错误对象,不会抛出属性异常。执行以下命令升级即可:
pip install --upgrade exchangelib
方案2:当前版本临时规避(无法升级时使用)
在原有遍历逻辑中添加allow_missing参数,允许查询结果跳过不存在的条目,修改后代码如下:
for folder in root.walk(): # 给查询集添加allow_missing=True参数,遇到缺失的邮件自动跳过 queryset = folder.all().order_by('-datetime_received').allow_missing(True) for message in queryset[:128]: # 对单条邮件执行相关操作 pass
如果添加参数后仍有异常,可以额外增加类型校验逻辑,过滤错误对象:
from exchangelib.errors import ErrorItemNotFound for folder in root.walk(): items = folder.all().order_by('-datetime_received')[:128] for item in items: if isinstance(item, ErrorItemNotFound): continue # 后续业务逻辑 pass
方案3:归档文件夹单独处理
由于错误仅在归档文件夹触发,可以在遍历时过滤掉归档文件夹,或对归档文件夹单独降低分页大小,减少批量查询时的错误概率:
for folder in root.walk(): # 跳过归档文件夹 if "Archive" in folder.name: continue for message in folder.all().order_by('-datetime_received')[:128]: # 业务逻辑 pass
内容的提问来源于stack exchange,提问作者EpsiophI
相关产品推荐
相关产品推荐

