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

Django配置Office 365 SMTP发邮件遇535认证失败问题求助

Django 连接 Office365 SMTP 报 535 认证失败问题解决方案

问题描述

发送邮件时触发以下错误:

535, b"5.7.139 Authentication unsuccessful, user is locked by your organization's security defaults policy.

现有配置

当前Django邮件配置如下:

#Emailing Settings
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.office365.com'
EMAIL_FROM = 'email@email.com'
EMAIL_HOST_USER = 'email@email.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587
EMAIL_USE_TLS= True

可行方案

1. 能否禁用特定邮箱的安全默认设置?风险如何?

  • 微软的安全默认设置是租户(组织)全局生效的,无法单独对某个邮箱关闭,只能针对整个组织关闭该设置。
  • 风险:安全默认设置是微软为组织提供的基础安全防护,关闭后会失去多项关键保护——比如强制MFA验证、阻止传统认证协议(包括SMTP基本认证)的防护,账号遭遇暴力破解、凭证填充攻击的概率会大幅上升,因此微软明确标注不推荐此操作。

2. 实现OAuth认证的具体步骤

微软推荐使用OAuth替代SMTP基本认证,以下是具体实现步骤:

步骤1:注册Azure AD应用程序

  • 登录Azure门户,进入「Azure Active Directory」→「应用注册」→「新注册」
  • 填写应用名称,选择账户类型(推荐选「仅此组织目录中的账户」),重定向URI选「公共客户端/native (mobile & desktop)」,输入http://localhost
  • 注册完成后,记录客户端ID和租户ID

步骤2:配置应用权限

  • 进入已注册的应用→「API权限」→「添加权限」→ 选择「Microsoft Graph」→「应用权限」
  • 添加Mail.Send权限,然后点击「授予管理员同意」(需要租户管理员权限)
  • 在「证书和机密」中创建一个客户端密码,记录生成的客户端密钥

步骤3:安装依赖库

执行以下命令安装所需依赖:

pip install msal django

步骤4:自定义OAuth SMTP邮件后端

在项目目录下创建backends.py文件,写入以下代码:

import smtplib
from django.core.mail.backends.smtp import EmailBackend
from msal import ConfidentialClientApplication

class OAuth2SMTPBackend(EmailBackend):
    def open(self):
        if self.connection:
            return False

        # 替换为你的Azure应用凭证
        client_id = '你的客户端ID'
        tenant_id = '你的租户ID'
        client_secret = '你的客户端密钥'
        authority = f"https://login.microsoftonline.com/{tenant_id}"

        app = ConfidentialClientApplication(
            client_id,
            authority=authority,
            client_credential=client_secret
        )

        scopes = ["https://graph.microsoft.com/.default"]
        result = app.acquire_token_for_client(scopes=scopes)

        if "access_token" not in result:
            raise Exception(f"获取OAuth令牌失败: {result.get('error_description')}")

        try:
            self.connection = smtplib.SMTP(self.host, self.port)
            if self.use_tls:
                self.connection.starttls()
            self.connection.ehlo()
            self.connection.auth("XOAUTH2", lambda: result['access_token'])
            return True
        except Exception as e:
            self.close()
            raise e

步骤5:修改Django邮件配置

更新settings.py中的邮件设置:

# Email Settings
EMAIL_BACKEND = '你的项目路径.backends.OAuth2SMTPBackend'  # 例如: myproject.backends.OAuth2SMTPBackend
EMAIL_HOST = 'smtp.office365.com'
EMAIL_FROM = 'email@email.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
# 无需再设置EMAIL_HOST_USER和EMAIL_HOST_PASSWORD

步骤6:测试邮件发送

启动Django shell,执行测试代码:

from django.core.mail import send_mail
send_mail(
    'OAuth认证测试',
    '这是通过OAuth2认证发送的测试邮件',
    'email@email.com',
    ['收件人邮箱地址'],
    fail_silently=False,
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:52:49