You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

个人Hotmail账户SMTP基础认证禁用后OAuth2配置遇阻求助

问题分析与解决方案

核心问题

微软2024年10月起对Outlook/Exchange Online禁用SMTP基本认证,必须改用OAuth2认证。但个人微软账户(live.com/outlook.com)无法直接通过Azure门户的企业租户入口注册应用,因个人账户默认无Azure AD租户权限,导致出现AADSTS16000错误。

无需付费Azure订阅,正确操作步骤

  • 应用注册入口:个人账户需通过专属的应用注册界面操作,而非Azure门户的Entra ID企业租户页面:
    1. 用个人邮箱登录后,进入应用注册页面,选择「新注册」。
    2. 注册配置:支持账户类型选「任何组织目录中的账户和个人微软账户(例如Skype、Xbox)」,自定义应用名称,重定向URI选择「公共客户端/本机(移动和桌面)」,输入https://login.microsoftonline.com/common/oauth2/nativeclient。
  • 配置API权限:
    1. 注册完成后进入「API权限」,点击「添加权限」,选择「Microsoft Graph」。
    2. 选择「委托权限」,找到SMTP.Send权限并添加,最后点击「授予管理员同意」(个人账户自身即为管理员,直接确认即可)。
  • 修改Python代码实现OAuth2认证:
    使用MSAL库获取OAuth2令牌,替代原基本认证逻辑,示例代码如下:
import smtplib
from email.mime.text import MIMEText
from msal import PublicClientApplication

# 替换为你的信息
CLIENT_ID = "你的应用注册ID"
USER_EMAIL = "你的个人邮箱@outlook.com"
SCOPES = ["https://outlook.office365.com/SMTP.Send"]

# 初始化MSAL客户端
app = PublicClientApplication(CLIENT_ID, authority="https://login.microsoftonline.com/common")
# 交互式获取令牌(首次运行会弹出登录窗口)
result = app.acquire_token_interactive(SCOPES, account=USER_EMAIL)

if "access_token" in result:
    # 构建邮件
    msg = MIMEText("测试通知邮件内容")
    msg["Subject"] = "通知邮件"
    msg["From"] = USER_EMAIL
    msg["To"] = "收件人邮箱地址"

    # 发送邮件
    with smtplib.SMTP("smtp.office365.com", 587) as server:
        server.starttls()
        # 使用令牌登录,而非密码
        server.login(USER_EMAIL, result["access_token"], initial_response_ok=True)
        server.send_message(msg)
    print("邮件发送成功")
else:
    print(f"令牌获取失败: {result.get('error_description')}")
  • 关键注意事项:
    • 个人账户应用注册完全免费,无需付费Azure订阅。
    • 若遇跳转循环,清理浏览器缓存,确保登录的是个人微软账户而非工作/学校账户。
    • 令牌有效期约1小时,长期运行场景需实现刷新令牌自动续期逻辑。

内容的提问来源于stack exchange,提问作者Difan Zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:57:04