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
相关产品推荐
相关产品推荐

