Django远程服务器无法发送密码重置邮件,本地运行正常
问题分析与解决方案
从你提供的uwsgi.log内容里能一眼看出关键问题:邮件的发件人是**webmaster@localhost**,而不是你在local_settings.py里配置的support@mydomain.com——这说明远程服务器上的Django完全没加载到你的邮件配置!结合本地能正常工作的情况,大概率是部署环节的配置加载问题,下面一步步排查解决:
1. 确认local_settings.py被正确引入并存在
- 先登录远程服务器,到你的Django项目根目录,检查
local_settings.py是不是真的传上去了,内容和本地的完全一致(别漏了密码这类敏感配置)。 - 打开主
settings.py文件,确认末尾有没有加载local_settings的代码:
如果没有,赶紧加上——Django默认不会自动加载# 主settings.py的末尾应该有这段 try: from .local_settings import * except ImportError: passlocal_settings.py,必须显式引入。
2. 检查uWSGI的启动配置是否指向正确的settings
- 打开你的uWSGI配置文件(比如
uwsgi.ini或者uwsgi.yml),确认里面的module和env配置是否正确:
这里的# 示例uwsgi.ini配置 module = your_project_name.wsgi:application env = DJANGO_SETTINGS_MODULE=your_project_name.settingsyour_project_name.settings必须是你包含了local_settings引入的那个主settings文件,不能是其他自定义的settings模块。
3. 验证配置是否真的被加载
- 在远程服务器上启动Django shell,直接检查配置:
然后输入:python manage.py shell
如果输出的不是你在from django.conf import settings print("DEFAULT_FROM_EMAIL:", settings.DEFAULT_FROM_EMAIL) print("EMAIL_HOST:", settings.EMAIL_HOST)local_settings.py里设置的值,说明配置确实没加载,回到前两步排查文件存在性和引入逻辑。
4. 修正SMTP端口与加密方式的匹配问题
- 你当前配置的
EMAIL_PORT=465但EMAIL_USE_TLS=True,这里有个常见误区:465端口对应的是SSL加密,应该用EMAIL_USE_SSL=True;而TLS加密通常用587端口。本地可能因为环境兼容没出问题,但远程服务器可能严格校验,建议二选一调整:# 选项1:用TLS+587端口 EMAIL_PORT = 587 EMAIL_USE_TLS = True # 选项2:用SSL+465端口 EMAIL_PORT = 465 EMAIL_USE_SSL = True
5. 重启uWSGI服务
- 不管改了哪项配置,都要重启uWSGI让新配置生效:
# 如果是用systemd管理uWSGI sudo systemctl restart uwsgi # 如果是用pid文件重载 uwsgi --reload /var/run/your_project_uwsgi.pid
额外排查:查看服务器邮件日志
如果以上步骤都做完还是不行,可以查看服务器的邮件发送日志找具体错误:
- Debian/Ubuntu系统:
/var/log/mail.log - CentOS/RHEL系统:
/var/log/maillog
日志里会显示SMTP连接失败的原因,比如认证失败、端口被防火墙拦截、邮件服务商限制等。
内容的提问来源于stack exchange,提问作者Username
相关产品推荐
相关产品推荐

