无需使用Graph API读取Office 365邮件的可行方案咨询
Office 365邮件读取实现方案
目前没有完全脱离身份验证框架、仅靠原始用户名密码直接走传统IMAP基本认证的方案,微软已经在2022年全量禁用了Office 365所有邮件相关协议的基本身份验证,但可以通过以下不需要组织管理员权限的方案实现需求,操作全程仅需要你自己的账号登录授权,无需获取组织租户ID:
方案1:沿用IMAP协议(兼容原有开发逻辑)
你可以搭配OAuth2身份验证继续使用IMAP协议读取邮件,步骤如下:
- 自行注册Azure AD多租户应用:使用你自己的Office 365账号登录Azure后台注册应用,类型选择「个人账户和任何组织目录中的账户」,无需填写组织租户信息
- 给应用添加
IMAP.AccessAsUser.All委托权限,该权限属于用户可自行授权的范围,不需要组织管理员审批 - 身份验证通过后,即可用常规IMAP库连接
outlook.office365.com的993端口读取邮件,逻辑和之前使用IMAP基本一致,仅替换身份验证环节即可
Python参考代码片段:
import msal import imaplib # 通用多租户端点,不需要填租户ID authority = "https://login.microsoftonline.com/common" app = msal.PublicClientApplication("你的应用客户端ID", authority=authority) # 用户名密码流获取token result = app.acquire_token_by_username_password( "你的邮箱地址", "你的邮箱密码", scopes=["https://outlook.office.com/IMAP.AccessAsUser.All"] ) # 连接IMAP imap = imaplib.IMAP4_SSL("outlook.office365.com", 993) imap.authenticate("XOAUTH2", lambda x: f"user={你的邮箱地址}\x01auth=Bearer {result['access_token']}\x01\x01".encode())
C#可以搭配MailKit和Microsoft.Identity.Client库实现相同逻辑。
方案2:使用Graph API委托权限模式
如果可以调整原有实现逻辑,直接用Graph API更简单:
- 同样注册多租户Azure应用,添加
Mail.Read委托权限,无需管理员同意 - 支持用户名密码流或者设备代码流登录,使用
common通用端点不需要租户ID,验证通过后即可调用接口读取邮件。
注意:如果你的组织开启了条件访问策略禁用了用户名密码流,改用设备代码流即可,仅需要你在浏览器端登录自己的账号完成授权,全程不需要管理员介入。
内容的提问来源于stack exchange,提问作者Sandeep Bhutani
相关产品推荐
相关产品推荐

