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

使用imaplib访问Exchange邮箱:基本认证禁用后的认证方案

解决Outlook邮箱IMAP登录失败(基本认证禁用)的方案

微软已禁用Exchange Online的基本认证,传统的账号密码直接登录方式不再有效,必须改用OAuth 2.0认证完成IMAP连接。以下是具体实现方案:

实现步骤

1. 完成Azure AD应用注册

  • 登录Azure门户,注册新应用程序:
    • 租户ID:个人邮箱填common,企业邮箱填写对应租户ID
    • 平台选择「桌面和移动设备」,重定向URI设置为http://localhost
  • 为应用添加API权限:选择「Microsoft Graph」→ 委托权限,添加IMAP.AccessAsUser.All,完成后授予权限(个人邮箱自行同意,企业邮箱需管理员同意)

2. 安装依赖库

使用msal库处理OAuth2令牌的获取与管理:

pip install msal

3. 认证代码示例

import imaplib
from msal import PublicClientApplication

# 替换为你的实际配置信息
CLIENT_ID = "你的Azure AD应用客户端ID"
TENANT_ID = "common"  # 个人邮箱用common,企业邮箱填实际租户ID
USER_EMAIL = "your_outlook_email@example.com"
AUTHORITY = f"https://login.microsoftonline.com/{TENANT_ID}"
# IMAP服务所需的权限范围
SCOPE = ["https://outlook.office365.com/IMAP.AccessAsUser.All"]

# 初始化MSAL客户端
app = PublicClientApplication(CLIENT_ID, authority=AUTHORITY)

# 优先从缓存获取令牌
result = None
accounts = app.get_accounts(username=USER_EMAIL)
if accounts:
    result = app.acquire_token_silent(SCOPE, account=accounts[0])

# 缓存无有效令牌时,触发交互式登录(桌面端适用)
if not result:
    result = app.acquire_token_interactive(SCOPE, login_hint=USER_EMAIL)

if "access_token" in result:
    # 连接Outlook IMAP服务器
    imap = imaplib.IMAP4_SSL("outlook.office365.com", 993)
    # 构造XOAUTH2认证字符串
    auth_string = f"user={USER_EMAIL}\1auth=Bearer {result['access_token']}\1\1"
    imap.authenticate("XOAUTH2", lambda x: auth_string.encode('utf-8'))
    
    # 认证成功,可执行后续IMAP操作
    print("认证成功!")
    # 示例:列出邮箱文件夹
    typ, data = imap.list()
    print(data)
else:
    print(f"令牌获取失败: {result.get('error_description', '未知错误')}")

注意事项

  • 交互式登录适用于桌面应用场景;如果是无交互的后台服务,可使用客户端凭证流(需配置应用权限)或用户名密码流(仅特殊场景推荐使用)
  • 必须确保应用的权限已正确配置并完成授权,否则会导致令牌获取失败

内容的提问来源于stack exchange,提问作者GammaGames

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:11:08