Python exchangelib OAuth2认证失败问题求助
解决exchangelib自动发现时auth_type被重置为NTLM的问题
问题原因
你遇到的这个报错,核心原因是exchangelib 3.2.1版本的自动发现流程存在一个小bug:当你初始化Account时传入了指定auth_type=OAUTH2的Configuration,但开启autodiscover=True后,内部会重新生成一个新的Configuration实例,并且没有正确继承原配置的auth_type参数,默认使用了NTLM认证类型,这就和你传入的OAuth2Credentials类型不匹配,从而抛出ValueError。
解决方法
方法1:手动执行自动发现,构建完整配置
绕过Account自动创建配置的逻辑,手动完成自动发现并构建包含正确auth_type的Configuration:
from exchangelib import OAuth2Credentials, Account, Configuration, AutodiscoverProtocol, OAUTH2 # 初始化OAuth2凭证 credentials = OAuth2Credentials( client_id="xxxxxxxx-xxxx-etc", client_secret="xxxxxxxxxxxxx-etc", tenant_id="xxxxxxxx-xxxx-etc" ) # 手动执行自动发现,获取服务端点信息 protocol = AutodiscoverProtocol(credentials=credentials, auth_type=OAUTH2) autodiscover_results = protocol.autodiscover(primary_smtp_address='testAddr@example.com') # 取第一个有效的自动发现结果 selected_result = autodiscover_results[0] # 手动构建Configuration,明确指定auth_type config = Configuration( credentials=credentials, auth_type=OAUTH2, service_endpoint=selected_result.service_endpoint, server=selected_result.server, # 自动发现返回的其他必要参数,比如版本 version=selected_result.version ) # 初始化Account,关闭自动发现 acct = Account( primary_smtp_address='testAddr@example.com', config=config, autodiscover=False )
方法2:升级exchangelib到最新版本
这个自动发现时auth_type不继承的问题,在exchangelib后续版本中已经被修复。你可以先升级库:
pip install --upgrade exchangelib
升级完成后,再尝试你原来的代码,大概率就能正常运行了——新版本会正确继承原Configuration的auth_type参数,不会再被重置为NTLM。
方法3:强制指定auth_type(临时 workaround)
如果你暂时无法升级库,也可以尝试在初始化Account后,手动修改生成的配置的auth_type:
from exchangelib import OAuth2Credentials, Account, Configuration, OAUTH2 credentials = OAuth2Credentials( client_id="xxxxxxxx-xxxx-etc", client_secret="xxxxxxxxxxxxx-etc", tenant_id="xxxxxxxx-xxxx-etc" ) config = Configuration(credentials=credentials, auth_type=OAUTH2) acct = Account(primary_smtp_address='testAddr@example.com', config=config, autodiscover=True) # 手动修正auth_type acct.config.auth_type = OAUTH2 # 重新建立连接 acct.refresh_credentials()
不过这种方法属于临时 workaround,稳定性不如前两种方法。
内容的提问来源于stack exchange,提问作者Rich H
相关产品推荐
相关产品推荐

