旧Python应用:如何用imaplib+OAuth2.0访问Outlook邮箱(替代基础认证)
使用imaplib + OAuth2.0访问Outlook邮箱(Ubuntu环境)
前置准备
- 在Azure Active Directory中注册应用,获取以下核心信息:
- 客户端ID(Client ID)
- 客户端密钥(Client Secret)
- 租户ID(Tenant ID)
- 为应用添加
IMAP.AccessAsUser.All权限,若为企业账户需完成管理员同意
代码实现
无需更换现有库,仅需用requests获取OAuth2令牌(Ubuntu环境可通过pip install requests安装),再替换原有的认证逻辑即可。
第一步:获取OAuth2访问令牌
import requests def get_oauth_token(client_id, client_secret, tenant_id, email, password): token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token" payload = { "client_id": client_id, "client_secret": client_secret, "scope": "https://outlook.office.com/IMAP.AccessAsUser.All offline_access", "grant_type": "password", "username": email, "password": password } response = requests.post(token_url, data=payload) response.raise_for_status() return response.json()["access_token"]
注意:若账户开启了多因素认证(MFA),密码授权流程不可用,需改用授权码流程:引导用户手动授权获取授权码,再用授权码兑换访问令牌。
第二步:替换imaplib认证逻辑
将原有的mail.login(EMAIL, PASSWORD)替换为OAuth2认证,其余邮件读取、附件下载逻辑完全保留:
import imaplib # 配置信息 SERVER = "outlook.office365.com" EMAIL = "你的Outlook邮箱地址" CLIENT_ID = "你的Azure应用客户端ID" CLIENT_SECRET = "你的Azure应用客户端密钥" TENANT_ID = "你的Azure租户ID" PASSWORD = "你的邮箱密码(未开启MFA时使用)" # 获取访问令牌 access_token = get_oauth_token(CLIENT_ID, CLIENT_SECRET, TENANT_ID, EMAIL, PASSWORD) # 连接IMAP服务器并完成OAuth2认证 mail = imaplib.IMAP4_SSL(SERVER) # 构造XOAUTH2认证字符串,lambda用于适配imaplib的回调要求 mail.authenticate('XOAUTH2', lambda x: f"user={EMAIL}\x01auth=Bearer {access_token}\x01\x01") # 后续原有逻辑保持不变 mail.select('inbox') # 示例:搜索邮件 status, messages = mail.search(None, 'ALL') # ... 原有邮件读取、附件下载代码继续执行
关键说明
- imaplib原生支持
XOAUTH2认证机制,仅需通过authenticate方法传入符合规范的认证字符串,无需替换现有业务代码 - 若出现认证失败,优先检查Azure应用的权限配置是否正确、令牌是否有效
- 对于MFA账户,授权码流程更安全,可避免硬编码密码,实现方式为:先引导用户访问授权URL获取授权码,再用授权码向Azure令牌接口兑换访问令牌
内容的提问来源于stack exchange,提问作者user2905416
相关产品推荐
相关产品推荐

