Django项目SMTP认证错误求助:发送验证码遇SMTPSenderRefused
问题排查与解决方案
核心问题分析
你遇到的SMTPSenderRefused错误,根源是EMAIL_HOST_USER和EMAIL_HOST_PASSWORD为空值——因为你用os.environ.get()读取的是系统环境变量,但代码里定义的EMAIL_USER、EMAIL_PASS只是Python局部变量,并非系统环境变量,所以返回None,导致SMTP认证失败。
分步解决
1. 修复环境变量读取问题
有两种可行方案:
方案一:直接使用局部变量赋值
如果是测试阶段,或不想配置系统环境变量,直接把你定义的变量赋值给Django的邮件配置项:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_USER='user_email@gmail.com' EMAIL_PASS='userpassword' # 直接使用已定义的变量,而非读取系统环境变量 EMAIL_HOST_USER = EMAIL_USER EMAIL_HOST_PASSWORD = EMAIL_PASS
方案二:正确配置系统环境变量
如果遵循生产环境安全规范,需把邮箱账号和密码设置为系统环境变量:
- Linux/macOS:在启动项目的终端执行:
export EMAIL_USER='user_email@gmail.com' export EMAIL_PASS='userpassword' - Windows:在命令提示符执行:
set EMAIL_USER=user_email@gmail.com set EMAIL_PASS=userpassword - 推荐便捷方式:使用
python-dotenv管理环境变量- 安装依赖:
pip install python-dotenv - 在项目根目录创建
.env文件,写入:EMAIL_USER=user_email@gmail.com EMAIL_PASS=userpassword - 在
settings.py开头添加加载代码:import os from dotenv import load_dotenv # 加载.env文件中的环境变量 load_dotenv()
os.environ.get('EMAIL_USER')就能正确读取到值。 - 安装依赖:
2. 解决Gmail SMTP认证限制
即使配置了正确的账号密码,Gmail默认会阻止非官方应用登录,需做以下设置:
- 未开启两步验证:登录Google账号安全设置,开启「不太安全的应用访问权限」(注意:此方式会降低账号安全性,生产环境不推荐)。
- 已开启两步验证:在Google账号安全设置中找到「应用密码」选项(仅开启2FA后可见),选择「邮件」类型生成16位应用密码,用这个密码替换
EMAIL_PASS的值。
3. 测试验证
修改配置后,可在Django shell中测试邮件发送:
from django.core.mail import send_mail send_mail( '测试邮件', '这是一封测试邮件', 'your_email@gmail.com', ['recipient@example.com'], fail_silently=False, )
如果没有报错,说明配置成功。
内容的提问来源于stack exchange,提问作者Mohit Mishra
相关产品推荐
相关产品推荐

