如何使用Python结合OAuth2实现Office 365邮件的IMAP访问
解决Office 365 IMAP XOAUTH2认证问题
首先得纠正你代码里的一个关键问题:你用的https://graph.microsoft.com/.default scope不对,IMAP认证需要用Outlook的专属scope,应该改成https://outlook.office365.com/.default,不然拿到的token没法用于IMAP服务。
然后说imaplib.authenticate的第二个参数——它需要一个可调用对象(函数),这个函数要返回符合XOAUTH2格式的字节串,格式为:b"user={邮箱地址}\x01auth=Bearer {access_token}\x01\x01"
直接给你完整的修正代码:
import imaplib import msal # 替换成你的配置 client_id = '****-****-*-***' tenant_id = '****-****-*-***' client_secret = '****-****-*-***' target_email = '你的目标邮箱@xxx.com' # 比如admin@yourdomain.com server = 'outlook.office365.com' # 初始化MSAL客户端 app = msal.ConfidentialClientApplication( client_id, authority=f'https://login.microsoftonline.com/{tenant_id}', client_credential=client_secret ) # 获取token,注意scope换成Outlook IMAP的 result = app.acquire_token_for_client(scopes=['https://outlook.office365.com/.default']) # 检查是否成功获取token if "access_token" not in result: print(f"获取token失败: {result.get('error_description')}") exit() # 定义XOAUTH2认证回调函数 def xoauth2_auth(): token = result['access_token'] # 构造符合格式的认证字符串 auth_str = f"user={target_email}\x01auth=Bearer {token}\x01\x01" return auth_str.encode('utf-8') # 建立IMAP连接并认证 conn = imaplib.IMAP4_SSL(server) conn.debug = 4 # 传入认证机制和回调函数 conn.authenticate('XOAUTH2', xoauth2_auth) # 测试:列出邮箱文件夹 conn.list()
额外注意事项
- 你的Azure AD应用必须添加IMAP.AccessAsApp应用权限,并且需要全局管理员授予管理员同意,不然会提示权限不足。
- 目标邮箱需要在Exchange Online中启用IMAP访问(默认启用,若被禁用需手动打开)。
- Client Credential流适用于后台服务访问特定邮箱(或所有邮箱,取决于权限配置),如果是用户交互场景,应该改用Authorization Code流。
内容的提问来源于stack exchange,提问作者levraininjaneer
相关产品推荐
相关产品推荐

