使用exchangelib处理大量邮件时调用iterator()报错:QuerySet无此属性
解决exchangelib批量加载邮件时的分批处理问题
你遇到的错误是因为exchangelib的QuerySet对象没有iterator()方法,它本身内置了分批加载机制,不需要额外调用这个不存在的方法。另外你的代码还有隐藏问题:only()方法里未包含sender字段,直接访问item.sender会触发额外API请求甚至报错,必须把需要用到的字段都加到only()参数里。
下面是两种可行的解决方案:
方案一:直接迭代QuerySet(自动分批)
exchangelib的QuerySet在迭代时会自动从服务器分批拉取数据(默认每页1000条),只需去掉错误的.iterator()调用,并补充需要的字段:
from exchangelib import Credentials, Account for item in account.inbox\ .filter(is_read=False, sender__contains='gmail')\ .only('is_read', 'subject', 'body', 'sender') \ .order_by('-datetime_received'): print('Email subject is:', item.subject) print('Email is from:', item.sender)
方案二:手动控制分页大小
如果需要自定义每页加载的邮件数量(比如根据内存情况调整),可以用page()方法手动遍历每一页:
from exchangelib import Credentials, Account # 自定义每页加载的邮件数量 page_size = 500 mail_query = account.inbox\ .filter(is_read=False, sender__contains='gmail')\ .only('is_read', 'subject', 'body', 'sender') \ .order_by('-datetime_received') # 遍历每一页并处理邮件 for page in mail_query.page(page_size=page_size): for item in page: print('Email subject is:', item.subject) print('Email is from:', item.sender)
内容的提问来源于stack exchange,提问作者crow_disguised_as_pigeon
相关产品推荐
相关产品推荐

