Django发送验证邮件触发SMTPConnectError错误如何修复?
错误原因
你触发的SMTPConnectError (421, b'service not available (connection refused, too many connections)')是Gmail SMTP服务直接拒绝了你的连接请求,和你使用的发信调用方法无关,问题出在权限配置、网络连通性或连接频率限制三类场景。
修复方案
优先修复Gmail账号权限配置
目前Gmail已经不再支持直接用账号登录密码调用SMTP服务,你需要按以下规则调整配置:- 先为你的Gmail账号开启两步验证
- 进入谷歌账号安全设置页,生成应用专用密码,将
settings.py中EMAIL_HOST_PASSWORD的值替换为生成的16位专用密码,不要继续使用原账号登录密码
检查本地网络连通性
如果你在国内网络环境下开发,Gmail SMTP服务的连接会被限制,你可以先在本地命令行执行telnet smtp.gmail.com 587测试端口连通性:- 如果连通失败,开发阶段可以临时将邮件后端替换为控制台输出配置,方便调试逻辑,无需真的发送邮件:
# 替换settings.py中原EMAIL配置段 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' - 也可以替换为国内邮箱的SMTP服务(比如QQ邮箱、网易邮箱),适配国内网络环境
- 如果连通失败,开发阶段可以临时将邮件后端替换为控制台输出配置,方便调试逻辑,无需真的发送邮件:
优化代码逻辑避免触发频率限制
你当前的代码逻辑是每次收到注册请求就新建一个SMTP连接,短时间内请求量过高就会触发Gmail的连接频率限制,你可以做两处调整:- 将
user.save()方法移动到send_email.send()之前,避免发信失败时已创建的用户数据无法落库 - 线上环境可以把发信逻辑改为异步任务处理,控制发信频率,同时避免发信耗时阻塞注册请求
- 将
内容的提问来源于stack exchange,提问作者Donald
相关产品推荐
相关产品推荐

