使用exchangelib无法获取Exchange收件箱列表,返回NoneType错误
问题排查与修复
核心问题分析
你的代码存在几个关键错误,导致get_list返回None:
参数传递顺序错误
ExchangeConnecter的__init__方法定义参数顺序是(credentials: Credentials, email: str),但实例化时你传入的是ExchangeConnecter(mail, credentials),把邮箱地址和凭据的顺序搞反了。这会导致初始化Account时,primary_smtp_address被传入Credentials对象而非字符串,直接触发异常,self.account根本没有被创建。缺少sys模块导入
代码中使用了sys.exc_info()但未导入sys模块,这会在进入异常捕获块时抛出新的NameError,导致__init__方法执行失败,self.account始终未初始化。异常处理不严谨
未捕获具体异常类型,且未处理sys未导入的情况,同时没有在初始化失败时标记self.account的状态,导致调用get_list时访问未定义的self.account,触发的异常可能被隐式忽略,最终表现为返回None。QuerySet未转为可迭代对象
self.account.inbox.all()返回的是exchangelib的QuerySet对象,不是直接的列表,需要转换为列表才能正常打印或使用。
修复后的代码
import sys from exchangelib import Credentials, Account, DELEGATE class ExchangeConnecter: def __init__(self, credentials: Credentials, email: str) -> None: self.credentials = credentials self.email = email self.account = None # 初始化account为None,标记状态 try: self.account = Account( primary_smtp_address=self.email, credentials=self.credentials, autodiscover=True, access_type=DELEGATE, ) except Exception as e: # 捕获具体异常并输出详细信息 print(f"初始化账户失败: {str(e)}") def get_list(self): # 先检查account是否初始化成功 if not self.account: print("账户未初始化,无法获取收件箱列表") return [] # 将QuerySet转为列表 email_list = list(self.account.inbox.all()) return email_list # 实例化时修正参数顺序 mail = "johndoe@example.com" domain = "DOMAIN\\johndoe" password = "somepassword" credentials = Credentials(domain, password) connecter = ExchangeConnecter(credentials, mail) email_list = connecter.get_list() print(type(email_list)) print(email_list)
修复说明
- 修正了实例化时的参数顺序,确保
credentials和email传递正确 - 添加
sys模块导入,消除NameError - 初始化时先将
self.account设为None,便于后续检查状态 - 捕获具体的
Exception并输出详细错误信息,便于排查初始化问题 - 在
get_list中先检查账户状态,避免访问未定义的属性 - 将
QuerySet转为列表,返回可直接使用的邮件对象列表
内容的提问来源于stack exchange,提问作者Federico Frontini
相关产品推荐
相关产品推荐

