Django密码重置邮件无法接收求助(send_mail功能正常)
我之前也碰到过一模一样的情况:send_mail()能正常发邮件,但用内置的密码重置视图提交请求后,页面跳转正常却收不到Gmail的重置邮件。给你几个实用的排查方向:
显式指定重置视图的发件人
Django的PasswordResetView默认会使用SERVER_EMAIL作为发件邮箱,而非你配置的DEFAULT_FROM_EMAIL。可以直接在视图里指定发件人参数:path('password-reset/', auth_views.PasswordResetView.as_view( template_name='users/password_reset.html', from_email=settings.DEFAULT_FROM_EMAIL # 新增这一行 ), name='password_reset'),或者在
settings.py里把SERVER_EMAIL和DEFAULT_FROM_EMAIL设为同一个值:SERVER_EMAIL = DEFAULT_FROM_EMAIL用控制台后端确认邮件是否生成
临时替换邮件后端为控制台输出,验证Django是否真的生成了重置邮件:# settings.py 临时修改 EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"提交重置请求后,查看控制台输出的邮件内容,重点确认收件邮箱是否正确、邮件结构是否正常。如果控制台能看到邮件,说明问题出在SMTP发送或邮箱过滤环节;如果看不到,那可能是视图配置有遗漏。
排查Gmail的过滤与安全设置
- 先检查Gmail的垃圾邮件文件夹和已拦截邮件列表,很多时候重置邮件会被误判为垃圾邮件;
- 如果你用的是Google账号的应用密码,务必确认账号已开启两步验证,且应用密码是正确生成的(应用密码是一次性的,生成后要妥善保存);
- 换一个非Gmail邮箱(比如Outlook)测试,排查是不是Gmail的特定限制导致的。
自定义简化版重置邮件模板
默认的密码重置邮件模板可能包含被邮箱服务商判定为风险的内容。可以自定义极简模板测试:path('password-reset/', auth_views.PasswordResetView.as_view( template_name='users/password_reset.html', email_template_name='users/password_reset_email.html' # 指定自定义模板 ), name='password_reset'),然后在
users/password_reset_email.html里写最基础的内容:点击下方链接重置密码: {{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}开启Django邮件日志排查错误
在settings.py里添加日志配置,查看邮件发送的详细过程和可能的错误:LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': {'class': 'logging.StreamHandler'}, }, 'loggers': { 'django.core.mail': { 'handlers': ['console'], 'level': 'DEBUG', }, }, }运行重置流程后,控制台会输出SMTP连接、认证、发送的详细日志,比如有没有认证失败、收件人被拒绝等具体错误。
确认环境变量是否正确加载
有时候环境变量读取失败,导致EMAIL_HOST_USER或EMAIL_HOST_PASSWORD为空。可以在视图里临时打印这些值验证:# 在PasswordResetView中添加(或用Django Shell测试) from django.conf import settings print(settings.EMAIL_HOST_USER) print(settings.EMAIL_HOST_PASSWORD)确保输出的是正确的Gmail账号和应用密码/密码。
内容的提问来源于stack exchange,提问作者A Gupta

