imapclient读取Office365已发送邮件报FETCH命令错误10如何解决?
问题解决方法
1. 代码逻辑错误(直接触发报错的核心原因)
你当前代码的循环逻辑存在严重冗余错误:在遍历单个UID的for i in UIDs循环中,每次调用imapObj.fetch()都传入了完整的UIDs全量ID列表,而非当前遍历的单个i。当已发送文件夹邮件数量较多时,单次请求数据量超过Office365 IMAP接口限制,就会直接返回BAD错误。
修正后的逻辑参考:
import imapclient, pprint , pyzmail ,re import socket out = {} socket.getaddrinfo('127.0.0.1', 8080) imapObj = imapclient.IMAPClient('outlook.office365.com', ssl=True) imapObj.login('email', 'pass') # 先确认已发送文件夹的正确名称再填入 imapObj.select_folder('Sent Items', readonly=True) UIDs = imapObj.search(['ALL']) # 一次性批量拉取所有邮件,不要在循环中重复调用fetch data = imapObj.fetch(UIDs, ['BODY[]']) for i in UIDs: message = pyzmail.PyzMessage.factory(data[i][b'BODY[]']) header = str(message.get_subject()) print(header)
如果已发送文件夹邮件量超过1000封,建议拆分UID列表分批拉取,每次拉取200-500封即可。
2. 已发送文件夹名称校验
Office365的邮箱文件夹名称会根据账户语言设置、企业自定义配置变化,并不一定固定为Sent Items,你可以取消代码中list_folders()的注释,打印所有文件夹的实际名称,确认已发送文件夹的正确命名后再传入select_folder方法。
补充优化项
- 操作已发送文件夹时建议开启readonly模式,避免误操作修改邮件状态
- Office365已逐步禁用基础密码认证的IMAP权限,如果后续出现登录报错,可以优先检查账户的IMAP权限和认证方式配置,建议优先使用OAuth2认证。
内容的提问来源于stack exchange,提问作者Alani
相关产品推荐
相关产品推荐

