使用Python win32com调用Outlook Redemption的GetMailTips遇WinHttp错误
使用Redemption官方GetMailTips基础示例代码连接云端O365 Exchange服务器时无法建立连接,核心问题为认证方式不兼容,报错包含多个401未授权错误及自动发现服务连接异常。
示例代码
import win32com.client win32com.client.gencache.EnsureDispatch("Outlook.Application") session = win32com.client.Dispatch("Redemption.RDOSession") session.SkipAutodiscoverLookupInAD = True session.Logon() adrentry = session.AddressBook.ResolveName("name@name.com") mailtips = adrentry.GetMailTips() #dir(mailtips) print(mailtips.OutOfOfficeMessage)
报错信息
com_error: (-2147352567, '发生异常。', (0, 'Redemption.RDOMailTips', 'WinHttpReceiveResponse错误: ERROR_WINHTTP_TIMEOUT\r\nWinHttpSendRequest(eCentral.mail.onmicrosoft.com/autodiscover/autodiscover.xml)错误: ERROR_WINHTTP_NAME_NOT_RESOLVED\r\nWinHttpSendRequest(autodiscover.eCentral.mail.onmicrosoft.com/autodiscover/autodiscover.xml)错误: ERROR_WINHTTP_CANNOT_CONNECT\r\n来自https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml的HTTP错误401\r\n服务器响应:\r\n\r\nWinHttpQueryHeaders错误: ERROR_WINHTTP_HEADER_NOT_FOUND\r\n预期HTTP_STATUS_REDIRECT,收到403\r\nWinHttpSendRequest(eCentral.mail.onmicrosoft.com/autodiscover/autodiscover.xml)错误: ERROR_WINHTTP_NAME_NOT_RESOLVED\r\nWinHttpSendRequest(autodiscover.eCentral.mail.onmicrosoft.com/autodiscover/autodiscover.xml)错误: ERROR_WINHTTP_CANNOT_CONNECT\r\n来自https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml的HTTP错误401\r\n服务器响应:\r\n\r\n来自https://outlook.office365.com/autodiscover/autodiscover.xml的HTTP错误401\r\n服务器响应:\r\n\r\n来自https://outlook.office365.com/autodiscover/autodiscover.xml的HTTP错误401\r\n服务器响应:\r\n', None, 0, -2147418113), None)
O365已废弃传统基本认证,原代码使用的RDOSession.Logon()默认认证方式无法通过验证,需改用OAuth认证连接,步骤如下:
Azure AD应用注册配置
- 在Azure门户注册应用,添加
Exchange Online的Mail.Read等必要权限(按需调整),并获取管理员同意。 - 记录应用的租户ID、客户端ID,以及客户端密钥(或证书指纹)。
- 在Azure门户注册应用,添加
修改代码实现OAuth登录
替换原session.Logon()调用,使用LogonHostedExchangeMailbox方法传入OAuth凭据,示例代码:import win32com.client session = win32com.client.Dispatch("Redemption.RDOSession") session.SkipAutodiscoverLookupInAD = True # 替换为实际信息 tenant_id = "你的租户ID" client_id = "你的客户端ID" client_secret = "你的客户端密钥" user_email = "你的邮箱地址" # OAuth认证登录 session.LogonHostedExchangeMailbox( user_email, f"oauth2://{tenant_id}/{client_id}/{client_secret}" ) adrentry = session.AddressBook.ResolveName("name@name.com") mailtips = adrentry.GetMailTips() print(mailtips.OutOfOfficeMessage)关键注意事项
- 确保Redemption版本为v5.21及以上(支持OAuth认证)。
- 若使用证书替代客户端密钥,调整连接字符串为
oauth2://{tenant_id}/{client_id}/cert://{证书指纹}。
内容的提问来源于stack exchange,提问作者gregb212

