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

使用imaplib通过有效access_token访问Outlook邮件时遇AUTHENTICATE failed错误

问题:使用imaplib访问Outlook邮件时AUTHENTICATE失败

我尝试使用imaplib访问Outlook邮件,具体实现代码如下:

import imaplib
import base64
from msal import ConfidentialClientApplication

def get_access_token():
    tenant_id = '************************************'
    authority = 'https://login.microsoftonline.com/' + tenant_id
    client_id = '************************************'
    client_secret = '************************************'
    scopes = ['https://outlook.office365.com/.default']
    app = ConfidentialClientApplication(client_id, authority=authority,
          client_credential = client_secret)
    ans = app.acquire_token_for_client(scopes=scopes)
    return ans['access_token']

def generate_auth_string(user, token):
    auth_string = f'user={user}\1auth=Bearer {token}\1\1'
    auth_string = base64.b64encode(auth_string.encode()).decode()
    return auth_string

# IMAP AUTHENTICATE
imap = imaplib.IMAP4_SSL('outlook.office365.com')
user_email = "my_email@my_company_domain.ca"
access_token = get_access_token()
print(f"Access Token: {access_token}")  # Print the access token to check if it's correct

try:
    imap.authenticate("XOAUTH2", lambda _: generate_auth_string(user_email, access_token))
    imap.select('inbox')
except imaplib.IMAP4.error as e:
    print(f"Error: {e}")

目前我能够获取到有效的access_token,但调用authenticate方法时却出现AUTHENTICATE failed错误,错误信息缺乏有效提示。已在网上搜索但未找到解决方法,恳请帮忙指出代码或Azure门户配置中缺失的内容,谢谢!


可能的原因与解决方法

  • Azure应用权限配置问题

    • 确保在Azure门户中给应用注册添加了IMAP.AccessAsApp应用权限(属于Office 365 Exchange Online权限组),并且已经完成管理员同意。客户端凭证模式(ConfidentialClientApplication)只能使用应用权限,不能用委托权限。
    • 配置步骤:进入Azure门户→应用注册→目标应用→API权限→添加权限→选择Office 365 Exchange Online→应用权限→勾选IMAP.AccessAsApp→添加权限,最后让全局管理员点击“授予管理员同意”。
  • 邮箱权限分配问题

    • 客户端凭证模式下,需给Azure应用分配访问目标邮箱的权限。通过Exchange Online PowerShell执行命令:
      New-ApplicationAccessPolicy -AppId <你的client_id> -PolicyScopeGroupId <目标邮箱地址> -AccessRight FullAccess -Description "允许应用访问该邮箱"
      
      执行后等待15-30分钟让权限生效。
  • XOAUTH2认证字符串格式问题

    • 认证字符串中的\1是ASCII的SOH字符(值为1),部分环境下硬编码转义可能出错,可修改generate_auth_string函数:
      def generate_auth_string(user, token):
          soh = chr(1)
          auth_string = f'user={user}{soh}auth=Bearer {token}{soh}{soh}'
          auth_string = base64.b64encode(auth_string.encode()).decode()
          return auth_string
      
  • 访问令牌验证

    • 用jwt.ms解析access_token,检查两个关键字段:
      • aud必须为https://outlook.office365.com
      • roles必须包含IMAP.AccessAsApp
        若不符合,说明权限配置或scopes设置有问题,当前代码的scopeshttps://outlook.office365.com/.default是正确的,需重新检查权限配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:17:30