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

Django网站联系表单邮件发送失败:535认证错误(微软基础认证已禁用)解决方案咨询

Django网站联系表单邮件发送失败:535认证错误(微软基础认证已禁用)解决方案咨询

嘿,我之前也踩过一模一样的坑!微软确实在近几年逐步淘汰了Exchange Online的基础认证(Basic Auth),所以你原来那种直接用EMAIL_HOST_USER和EMAIL_HOST_PASSWORD走SMTP的老方式,肯定会触发535认证失败的错误。别慌,我给你几个在Django里可行的替代方案,都是我亲测有效的:

方案一:使用Microsoft Graph API(微软官方推荐)

这是微软现在主推的合规认证方式,安全性拉满,也不用担心后续再被禁用。步骤大概是这样的:

  • 先在Azure AD里注册一个应用,获取到租户ID、客户端ID和客户端密码(注意这个密码是平台生成的,不是你的个人邮箱密码)
  • 给这个注册的应用添加「Mail.Send」的应用权限,并且需要管理员同意该权限
  • 安装Python的Graph API相关依赖,比如msgraph-core和azure-identity
  • 替换你原来的send_mail逻辑,示例代码如下:
from azure.identity import ClientSecretCredential
from msgraph.core import GraphClient
from django.template.loader import render_to_string

# 从Django配置中读取参数
TENANT_ID = '你的租户ID'
CLIENT_ID = '你的客户端ID'
CLIENT_SECRET = '你的客户端密码'
SENDER_EMAIL = '你的接收邮箱地址'

def send_contact_email(first_name, last_name, email, content):
    html = render_to_string('emails/contact_form.html', {
        'first_name': first_name,
        'last_name': last_name,
        'email': email,
        'content': content
    })
    
    # 初始化认证客户端
    credential = ClientSecretCredential(
        tenant_id=TENANT_ID,
        client_id=CLIENT_ID,
        client_secret=CLIENT_SECRET
    )
    graph_client = GraphClient(credential=credential)
    
    # 构造邮件请求体
    mail_payload = {
        'message': {
            'subject': 'Message',
            'body': {
                'contentType': 'HTML',
                'content': html
            },
            'toRecipients': [
                {
                    'emailAddress': {
                        'address': SENDER_EMAIL
                    }
                }
            ],
            'from': {
                'emailAddress': {
                    'address': SENDER_EMAIL
                }
            }
        },
        'saveToSentItems': 'true'
    }
    
    # 调用Graph API发送邮件
    graph_client.post('/me/sendMail', json=mail_payload)

这个方式虽然前期配置步骤多一点,但完全符合微软的最新规范,是长期可行的方案。

方案二:应用密码(过渡救急方案,不推荐长期使用)

如果你的微软账号还支持生成应用密码(现在新注册的账号大概率已经关闭这个功能了),可以用这个临时救急:

  • 登录你的微软账号,在安全设置里找到「应用密码」选项
  • 生成一个专门用于邮件发送的应用密码
  • 把Django配置里的EMAIL_HOST_PASSWORD替换成这个生成的应用密码,其他SMTP配置保持不变(比如EMAIL_HOST还是smtp.office365.com,EMAIL_PORT设为587,EMAIL_USE_TLS开启)
    不过要注意,微软已经在逐步淘汰应用密码功能,哪天突然不能用都有可能,所以尽量还是转成方案一。

方案三:切换到第三方邮件服务(最简单的快速解决方式)

如果觉得Graph API配置太繁琐,直接换用SendGrid、Mailgun这类第三方邮件服务也是个好选择,10分钟就能搞定:

  • 比如用SendGrid的话,注册账号后获取一个API Key
  • 在Django的settings里修改邮件配置:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = 'apikey'
EMAIL_HOST_PASSWORD = '你的SendGrid API Key'

改完之后,你原来的send_mail代码完全不用动,直接就能正常发送邮件!我当时就是用这个方案先救的急,太省心了。

对了,你原来的send_mail代码逻辑本身是没问题的,就是认证方式过时了,换上面任意一种方案都能解决535的错误。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:34:28