如何使用Python通过Microsoft OAuth2认证Outlook邮件服务器?
在Python中实现Outlook OAuth2认证及邮件操作
一、前期准备:Azure AD应用注册
- 登录Azure门户,创建一个应用注册(账户类型选择「任何组织目录中的账户和个人Microsoft账户」,适配Outlook个人/企业版)
- 进入应用的「API权限」,添加Microsoft Graph的权限:
Mail.Read、Mail.ReadWrite(仅读取邮件选Mail.Read即可),企业账户需授予管理员同意 - 记录三个关键信息:客户端ID(Application ID)、租户ID(Directory ID)、客户端密码(在「证书和密码」中生成,生成后立即保存,仅显示一次)
二、安装依赖库
执行以下命令安装所需Python库:
pip install exchangelib msal
msal:处理Microsoft OAuth2令牌的获取与刷新exchangelib:连接Outlook服务器、操作邮件及文件夹
三、OAuth2认证代码实现
from exchangelib import OAuth2Credentials, Account from msal import ConfidentialClientApplication # 替换为你的实际信息 CLIENT_ID = "你的客户端ID" TENANT_ID = "你的租户ID" CLIENT_SECRET = "你的客户端密码" USER_EMAIL = "你的Outlook邮箱地址" # 初始化MSAL机密客户端(适合无人值守的自动化脚本) app = ConfidentialClientApplication( client_id=CLIENT_ID, client_credential=CLIENT_SECRET, authority=f"https://login.microsoftonline.com/{TENANT_ID}" ) # 获取访问令牌 scopes = ["https://outlook.office365.com/.default"] result = app.acquire_token_for_client(scopes=scopes) if "access_token" not in result: raise Exception(f"认证失败:{result.get('error_description')}") # 构建OAuth2凭证 oauth_creds = OAuth2Credentials( access_token=result["access_token"], refresh_token=None, # 机密客户端模式会自动刷新令牌 client_id=CLIENT_ID, client_secret=CLIENT_SECRET, tenant_id=TENANT_ID ) # 连接到Outlook账户 account = Account( primary_smtp_address=USER_EMAIL, credentials=oauth_creds, autodiscover=True, access_type="delegate" ) print("认证成功,已连接到Outlook账户")
四、后续邮件操作示例
1. 访问邮件文件夹
# 获取收件箱 inbox = account.inbox # 获取自定义文件夹(路径层级需匹配实际结构) custom_folder = account.root / "自定义文件夹名称"
2. 查找特定邮件
# 筛选主题含关键词的未读邮件 filtered_emails = inbox.filter(subject__contains="项目通知", is_read=False) # 遍历输出前10条结果 for email in filtered_emails[:10]: print(f"主题:{email.subject}") print(f"发件人:{email.sender}") print(f"接收时间:{email.datetime_received}") print(f"内容预览:{email.body[:200]}...\n")
注意事项
- 个人Outlook账户可将租户ID替换为
common - 若为桌面交互场景,可改用公共客户端模式(需用户手动登录授权)
- 确保应用注册的权限范围与实际操作需求匹配,避免权限不足报错
内容的提问来源于stack exchange,提问作者Jamalie Puran
相关产品推荐
相关产品推荐

