认证完成后无法访问Office 365共享邮箱:已认证但未连接
开发读取共享邮箱的Daemon应用,已在Azure完成注册,能成功获取Access Token,但访问收件箱时触发错误。错误日志:
26:14.88 < b'CKLI1 OK AUTHENTICATE completed.'
26:14.88 > b'CKLI2 SELECT inbox'
26:14.88 < b'CKLI2 BAD User is authenticated but not connected.'
已验证应用权限:执行Test-ApplicationAccessPolicy -Identity sharedMailboxAddress -AppId myappnum后,AccessCheckResult返回Granted。
conf = json.load(open(sys.argv[1])) def generate_auth_string(user, token): return f"user={user}\x01auth=Bearer {token}\x01\x01" # 获取Token流程 result = None # 先从缓存查找Token(Daemon模式无需用户账户,account设为None) app = msal.ConfidentialClientApplication(conf['client_id'], authority=conf['authority'], client_credential=conf['secret']) result = app.acquire_token_silent(conf['scope'], account=None) if not result: print("缓存中无可用Token,获取新Token。") result = app.acquire_token_for_client(scopes=conf['scope']) if "access_token" in result: print(result['token_type']) pprint.pprint(result) else: print(result.get("error")) print(result.get("error_description")) print(result.get("correlation_id")) # IMAP认证与收件箱访问 imap = imaplib.IMAP4_SSL('outlook.office365.com', 993) imap.debug = 4 imap.authenticate("XOAUTH2", lambda x:generate_auth_string('sharedMailboxAddress',result['access_token'])) imap.select('Inbox')
这个错误通常是Token权限或配置不符合Daemon模式访问共享邮箱的要求,可按以下步骤排查修复:
确认Scope配置正确
Daemon应用必须使用https://outlook.office365.com/.default作为scope,不能使用委派类型的scope。检查conf['scope']是否设置为["https://outlook.office365.com/.default"]。验证Token权限
用JWT解码工具解码获取到的Access Token,确认:aud字段值为https://outlook.office365.comroles字段包含IMAP.AccessAsApp权限
检查Azure应用权限配置
确保Azure AD应用已添加应用权限IMAP.AccessAsApp,且已完成全局管理员同意。委派权限无法用于Daemon模式访问共享邮箱。确认共享邮箱地址正确性
generate_auth_string中的user参数必须是共享邮箱的完整SMTP地址,确保拼写无误,与Test-ApplicationAccessPolicy中使用的地址一致。
完成以上检查后重新测试,即可解决认证后无法访问收件箱的问题。
内容的提问来源于stack exchange,提问作者Kei Moon

