Django使用Gmail SMTP发送邮件失败 凭证报错解决方法
报错说明
你看到的报错信息原文:b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8 BadCredentials f14-20020a05600c4e8e00b0039c5642e430sm4688852wmq.20 - gsmtp'
翻译为:
5.7.8 用户名和密码未被接受,错误标识为BadCredentials,对应SMTP服务节点为gsmtp
这个报错的核心触发原因:Gmail已正式下线「低安全性应用访问」权限,所有第三方客户端/服务不能再直接使用Gmail账号的登录密码通过SMTP发信,必须使用官方认可的鉴权方式,个人开发场景下配置成本最低的方案是使用应用专用密码。
前置条件
- 目标Gmail账号必须已开启两步验证,这是生成应用专用密码的强制前提,未开启两步验证的账号不会显示应用专用密码入口。
操作步骤
1. 生成Gmail应用专用密码
- 登录对应谷歌账号,进入账号安全设置页面
- 在「登录Google」板块找到「应用专用密码」入口(开启两步验证后通常需要等待1-5分钟才会显示该入口,刷新页面即可)
- 应用类型选择「其他」,自定义标识名称(比如填
Django服务方便后续管理),点击生成按钮后会得到一串16位的专用密码,该密码仅展示一次,及时复制保存。
2. 修改Django项目配置
在项目的settings.py文件中添加/修改如下邮件配置,注意密码字段填写刚才生成的16位应用专用密码,不要填写Gmail账号的日常登录密码:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = '你的完整Gmail地址,例如example@gmail.com' EMAIL_HOST_PASSWORD = '16位应用专用密码,填写时去掉密码显示时的分隔空格' DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
3. 发信测试
可以直接通过Django Shell执行测试代码验证配置是否生效:
from django.core.mail import send_mail send_mail( subject='测试邮件标题', message='这是一封来自Django服务的测试邮件', from_email=EMAIL_HOST_USER, recipient_list=['测试收件人邮箱地址'], fail_silently=False, )
执行后没有抛出异常、收件箱能收到测试邮件即代表配置成功。
常见问题排查
- 填写
EMAIL_HOST_PASSWORD时不要使用账号日常登录密码,必须使用16位应用专用密码 - 本地/服务器网络需要能正常连通
smtp.gmail.com的587端口,如果服务部署在国内,注意检查网络出口策略,端口阻断也会触发连接类报错 - 生成应用专用密码时不要选择「邮件」「Windows」「Mac」这类预设应用类型,选择「其他」自定义名称即可,避免权限范围不匹配
- 如果连续输错多次专用密码,谷歌会临时阻断该IP的SMTP请求,等待10分钟左右再重试即可
内容的提问来源于stack exchange,提问作者Zain Khan
相关产品推荐
相关产品推荐

