You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:55:25