Django生产环境发送邮件遇[Errno 111]连接拒绝问题求助
解决Django生产环境发送邮件[Errno 111] Connection refused错误
1. 修正配置文件的致命拼写错误
你的settings.py里存在明显拼写错误:EMAIL_HOSTS应改为EMAIL_HOST(多了末尾的s)。Django会因无法识别错误配置而默认尝试连接本地SMTP服务,最终导致生产环境连接拒绝。修正后代码:
EMAIL_HOST = 'smtp.gmail.com' # 移除末尾多余的s
2. 验证Gmail账号权限配置
使用Gmail作为SMTP服务时,生产环境需满足以下条件:
- 若账号开启两步验证,必须用应用专用密码替代原密码作为
EMAIL_HOST_PASSWORD - 未开启两步验证的账号,需在Google账号设置中允许“不太安全的应用访问”(注:该选项目前已被Google逐步移除,优先推荐使用应用专用密码)
3. 排查生产环境网络限制
- 服务器防火墙/安全组必须允许出站访问
smtp.gmail.com的587端口 - 部分云服务商(如阿里云、AWS)默认限制SMTP出站流量,需在控制台手动解除限制或提交开通申请
- 可在生产服务器上执行以下命令测试连通性:
telnet smtp.gmail.com 587 # 或使用nc命令 nc -zv smtp.gmail.com 587
若连接失败,说明是网络层面问题,需联系服务器管理员或服务商解决。
4. 确认环境变量加载正确性
你使用config()函数读取环境变量,需确保生产环境的变量配置无误:
EMAIL_USE_TLS值为True(587端口要求TLS加密)EMAIL_HOST_USER和EMAIL_HOST_PASSWORD无拼写错误或多余空格
可在生产环境的Django Shell中验证配置:
from django.conf import settings print(settings.EMAIL_HOST) print(settings.EMAIL_USE_TLS) print(settings.EMAIL_HOST_USER)
5. 视图代码优化(非致命但建议修正)
视图中变量名send_mail与Django内置send_mail函数重名,虽不影响功能但易造成混淆,建议修改:
email_message = EmailMessage(mail_subject, message, to=[to_email]) email_message.send()
内容的提问来源于stack exchange,提问作者shyam rathod
相关产品推荐
相关产品推荐

