个人Hotmail账户SMTP基础认证禁用后OAuth2配置遇阻求助
问题分析与解决方案
核心问题
微软2024年10月起对Outlook/Exchange Online禁用SMTP基本认证,必须改用OAuth2认证。但个人微软账户(live.com/outlook.com)无法直接通过Azure门户的企业租户入口注册应用,因个人账户默认无Azure AD租户权限,导致出现AADSTS16000错误。
无需付费Azure订阅,正确操作步骤
- 应用注册入口:个人账户需通过专属的应用注册界面操作,而非Azure门户的Entra ID企业租户页面:
- 用个人邮箱登录后,进入应用注册页面,选择「新注册」。
- 注册配置:支持账户类型选「任何组织目录中的账户和个人微软账户(例如Skype、Xbox)」,自定义应用名称,重定向URI选择「公共客户端/本机(移动和桌面)」,输入
https://login.microsoftonline.com/common/oauth2/nativeclient。
- 配置API权限:
- 注册完成后进入「API权限」,点击「添加权限」,选择「Microsoft Graph」。
- 选择「委托权限」,找到
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
相关产品推荐
相关产品推荐

