如何用Python调用Microsoft Graph API读取组织服务账号邮件并实现持久认证
Microsoft Graph API 无人值守读取服务账号邮件认证方案
核心原理
你之前了解到的需要浏览器交互的是授权码流,适用于有用户主动登录的前端/客户端场景。针对后台无人值守的脚本场景,微软官方提供了客户端凭证流,完全不需要人工操作,配套官方SDK会自动处理token过期刷新,无需每小时手动授权,大量开发者均通过该方案实现同类需求。
前置Azure配置要求(必须完成)
- 应用注册的「API权限」板块添加Microsoft Graph的应用权限(不要选委托权限,委托权限才需要用户登录授权),根据需求选择
Mail.Read(单邮箱权限)或Mail.Read.All(全租户邮箱权限) - 权限添加完成后,必须由租户管理员点击「授予管理员同意」,否则调用接口会返回403错误
- 确认已获取三个核心凭证:租户ID、客户端ID(client id)、客户端密钥(client secret)
Python实现代码
首先安装依赖包:
pip install azure-identity msgraph-core
示例代码:
from azure.identity import ClientSecretCredential from msgraph.core import GraphClient import os # 建议从环境变量读取凭证,不要硬编码在代码中 TENANT_ID = os.getenv("AZURE_TENANT_ID") CLIENT_ID = os.getenv("AZURE_CLIENT_ID") CLIENT_SECRET = os.getenv("AZURE_CLIENT_SECRET") # 要读取的目标服务账号邮箱地址 TARGET_EMAIL = "service_account@your-organization.com" # 初始化凭证,该类会自动处理token刷新,无需手动管理token有效期 credential = ClientSecretCredential( tenant_id=TENANT_ID, client_id=CLIENT_ID, client_secret=CLIENT_SECRET, scopes=["https://graph.microsoft.com/.default"] ) # 初始化Graph客户端 graph_client = GraphClient(credential=credential) # 示例:读取目标账号最新的10封邮件 response = graph_client.get(f"/users/{TARGET_EMAIL}/messages?$top=10&$select=subject,receivedDateTime,from") if response.status_code == 200: mails = response.json()["value"] for mail in mails: print(f"主题:{mail['subject']},接收时间:{mail['receivedDateTime']},发件人:{mail['from']['emailAddress']['address']}") else: print(f"调用失败,错误码:{response.status_code},错误信息:{response.text}")
注意事项
- 生产环境不要硬编码客户端密钥等敏感信息,建议通过环境变量、密钥管理服务存储
- 如果需要限制应用只能访问指定的服务账号邮箱,不要授予全租户的
Mail.Read.All权限,可在Exchange Online中配置应用访问策略,限制应用仅能访问目标邮箱,降低安全风险 - 只要凭证有效、权限配置正确,脚本可长期稳定运行,无需任何手动授权操作
内容的提问来源于stack exchange,提问作者wymangr
相关产品推荐
相关产品推荐

