[Errno 111] Connection refused错误类型及解决,Django send_mail生产环境报错求助
Django send_mail生产环境出现[Errno 111] Connection refused的问题解决
错误类型说明
这是网络连接拒绝错误,核心原因是Django应用尝试连接SMTP邮件服务器时,目标服务器或生产环境的网络策略直接拒绝了连接请求。本地环境能正常运行,说明本地的SMTP配置、网络权限以及邮件服务器的访问规则是兼容的,问题出在生产环境的配置或网络层面。
解决方法
核对生产环境的SMTP配置参数
打开项目的settings.py,确认以下参数和本地完全一致:EMAIL_HOST:邮件服务器地址(比如smtp.gmail.com)EMAIL_PORT:对应端口(TLS用587,SSL用465,不要混淆)EMAIL_HOST_USER/EMAIL_HOST_PASSWORD:邮件账号和密码(如果是第三方邮箱,确认是否开启了SMTP服务,是否用了应用专用密码)EMAIL_USE_TLS/EMAIL_USE_SSL:加密方式要和端口匹配(比如587对应EMAIL_USE_TLS=True)
检查生产环境的防火墙与安全组规则
生产服务器的防火墙(比如iptables、ufw)或云服务商的安全组,可能禁止了出站连接邮件服务器的端口(587、465)。需要添加对应端口的出站允许规则,确保服务器能正常访问外部SMTP服务器。确认邮件服务器的访问限制
部分免费邮箱服务商(如QQ邮箱、163邮箱)会对非信任IP的连接做拦截,防止垃圾邮件。可以:- 联系邮件服务商确认生产服务器IP是否被加入黑名单
- 改用专业的邮件服务提供商(如SendGrid、Mailgun),这类服务对生产环境的兼容性更好
排查本地邮件服务的依赖(如果用localhost作为邮件服务器)
若本地环境依赖postfix或sendmail这类本地邮件服务,而生产环境未安装,设置EMAIL_HOST='localhost'就会导致连接失败。此时要么在生产环境安装对应本地邮件服务,要么切换到外部SMTP服务器地址。测试生产环境到邮件服务器的连通性
在生产服务器上执行命令测试连接,比如:telnet smtp.example.com 587如果连接失败,说明是网络问题;如果能成功连接,再回头排查Django的配置细节。
内容的提问来源于stack exchange,提问作者Amrit Singtan
相关产品推荐
相关产品推荐

