无Outlook客户端的远程服务器Python发Outlook邮件方案(SMTP禁用)
使用Microsoft Graph API发送Outlook邮件(非SMTP方案)
前置准备
- 联系管理员在Azure Active Directory中完成应用注册:
- 创建新应用,账户类型选择「组织目录中的账户」
- 生成客户端ID和客户端密钥(客户端凭据流,适配无交互服务器场景)
- 给应用添加**
Mail.Send应用权限**(注意不是委托权限),并让管理员完成权限同意
- 安装依赖库:执行
pip install requests
完整代码实现
import requests import json # 替换为你的实际配置信息 TENANT_ID = "你的租户ID" CLIENT_ID = "应用注册的客户端ID" CLIENT_SECRET = "应用注册生成的客户端密钥" SENDER_EMAIL = "发件人邮箱@你的组织域名.com" RECIPIENT_EMAIL = "收件人邮箱@目标域名.com" # 1. 获取Graph API访问令牌 token_url = f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token" token_data = { "grant_type": "client_credentials", "client_id": CLIENT_ID, "client_secret": CLIENT_SECRET, "scope": "https://graph.microsoft.com/.default" } token_res = requests.post(token_url, data=token_data) token_res.raise_for_status() access_token = token_res.json()["access_token"] # 2. 构造邮件并发送 send_mail_url = f"https://graph.microsoft.com/v1.0/users/{SENDER_EMAIL}/sendMail" mail_headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } mail_content = { "message": { "subject": "Graph API测试邮件", "body": { "contentType": "Text", "content": "这是无需SMTP服务,通过Microsoft Graph API发送的邮件。" }, "toRecipients": [ { "emailAddress": {"address": RECIPIENT_EMAIL} } ] # 可选:添加抄送/附件,格式参考Graph API官方定义 }, "saveToSentItems": "true" } mail_res = requests.post(send_mail_url, headers=mail_headers, data=json.dumps(mail_content)) mail_res.raise_for_status() print("邮件发送成功")
关键说明
- 客户端凭据流适配无交互的远程服务器场景,无需用户登录,应用本身拥有发件权限
- 必须确保
Mail.Send权限是应用权限,委托权限无法满足服务器无交互需求 - 租户ID可在Azure AD「概述」页面获取,客户端ID/密钥在应用注册的「证书和密码」页生成
- 如需发送HTML邮件,将
contentType改为HTML,content填写HTML代码即可
常见问题排查
- 权限错误:检查权限类型是否为应用权限、管理员是否已同意、配置信息是否正确
- 404错误:确认发件人邮箱是租户内有效账号,应用已被授权访问该账号的邮件功能
内容的提问来源于stack exchange,提问作者karthi
相关产品推荐
相关产品推荐

