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

已设置应用密码与双因素认证,仍无法用smtplib登录Outlook服务器

Outlook SMTP登录失败(基本认证禁用)解决办法

问题根源

Outlook/Office 365目前默认禁用了SMTP基本认证,哪怕你已经开启双因素认证、生成了应用密码,smtplib自带的login()方法采用基本认证仍会被服务器拒绝,这就是你遇到5.7.139 Authentication unsuccessful错误的核心原因。而Gmail当前仍支持应用密码+基本认证的组合,因此同一份代码在Gmail环境下能正常运行。

解决办法:切换为OAuth2认证

要让Python程序正常连接Outlook SMTP服务器,必须使用OAuth2认证方式,具体步骤如下:

1. 在Azure门户注册应用并获取认证凭据

  • 登录Azure门户,进入Azure Active Directory → 应用注册 → 新注册
  • 填写应用名称,选择「任何组织目录中的帐户和个人Microsoft帐户」,重定向URI填写http://localhost,完成注册
  • 进入应用的证书和密码页面,创建一个客户端密码,记录下密码值(仅显示一次)
  • 进入API权限页面,搜索Microsoft Graph,选择应用权限,添加Mail.Send权限,随后点击授予管理员同意
  • 记录好应用的客户端ID、租户ID和刚才创建的客户端密码,后续代码会用到

2. 使用msal库实现OAuth2认证发送邮件

先安装依赖库:

pip install msal

替换后的完整代码:

import smtplib
from msal import ConfidentialClientApplication

# 基础配置信息
SMTP_SERVER = 'smtp.office365.com'
SMTP_PORT = 587
SENDER_EMAIL = 'myemail@outlook.com'

# 替换为你自己的Azure应用凭据
CLIENT_ID = "你的客户端ID"
TENANT_ID = "你的租户ID"
CLIENT_SECRET = "你的客户端密码"
SCOPE = ["https://outlook.office.com/SMTP.Send"]

def get_access_token():
    app = ConfidentialClientApplication(
        CLIENT_ID,
        authority=f"https://login.microsoftonline.com/{TENANT_ID}",
        client_credential=CLIENT_SECRET
    )
    result = app.acquire_token_for_client(scopes=SCOPE)
    if "access_token" in result:
        return result["access_token"]
    raise Exception(f"获取token失败:{result.get('error_description')}")

def send_test_email():
    try:
        token = get_access_token()
        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        server.starttls()
        # 使用XOAUTH2协议完成认证
        server.login(SENDER_EMAIL, token, initial_response_ok=True)
        
        # 构造测试邮件内容
        msg = """Subject: OAuth2测试邮件

这是通过Python+OAuth2认证发送的Outlook测试邮件。
"""
        # 替换为实际收件人邮箱
        server.sendmail(SENDER_EMAIL, ["recipient@example.com"], msg)
        print("邮件发送成功!")
    except Exception as e:
        print(f"执行出错:{e}")
    finally:
        server.quit()

if __name__ == "__main__":
    send_test_email()

3. 不推荐的临时方案:启用SMTP基本认证

如果你不想部署OAuth2,可以尝试临时开启SMTP基本认证,但微软已明确逐步淘汰该方式,未来可能会失效:

  • 登录Outlook网页版,进入设置→查看所有Outlook设置→邮件→同步电子邮件
  • 找到「POP和IMAP」选项,确保「允许设备和应用使用POP」「允许设备和应用使用IMAP」均已开启
  • 同时检查Microsoft 365管理中心的Exchange→邮件流→连接器,确认全局未禁用基本认证

内容的提问来源于stack exchange,提问作者Ayush Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:07:20