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

