Django忘记密码邮件发送功能异常求助
Django忘记密码邮件无法发送的问题排查与修复
代码里的直接错误
参数传递错误:
views.py里调用send_forget_password_mail(user_obj,token)时,传的是整个用户对象,但helpers.py的函数需要接收邮箱字符串。应该改成send_forget_password_mail(user_obj.email, token)。消息类型误用:
用户不存在时用了messages.success,逻辑完全反了,换成messages.error(request, '未找到该用户名对应的用户')。邮件内容拼写错误:
消息里的"rest your password"是笔误,应该是"reset your password"。
必要的配置检查
确保settings.py里的邮件配置正确,以QQ邮箱为例:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.qq.com' EMAIL_PORT = 587 EMAIL_HOST_USER = '你的QQ邮箱@qq.com' EMAIL_HOST_PASSWORD = '邮箱授权码' # 不是登录密码,是邮箱设置里生成的授权码 EMAIL_USE_TLS = True DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
不同邮箱的SMTP参数不同,比如163邮箱用smtp.163.com、端口465+SSL,需要对应调整。
异常处理优化
原代码捕获异常只打印,建议把错误信息反馈给用户,方便排查:
except Exception as e: messages.error(request, f'发送邮件失败:{str(e)}') print(e)
修复后的完整代码
views.py
def ForgetPassword(request): try: if request.method == "POST": username = request.POST.get('username') if not User.objects.filter(username=username).first(): messages.error(request, '未找到该用户名对应的用户') return redirect('forget-password/') user_obj = User.objects.get(username=username) token = str(uuid.uuid4()) send_forget_password_mail(user_obj.email, token) messages.success(request, '重置密码邮件已发送,请查收') return redirect('/forget-password/') except Exception as e: messages.error(request, f'发送邮件失败:{str(e)}') print(e) return render(request, 'forget-password.html')
helpers.py
from django.core.mail import send_mail from django.conf import settings def send_forget_password_mail(email, token): subject = "重置密码链接" message = f'您好,请点击以下链接重置您的密码:http://127.0.0.1:8000/change-password/{token}/' email_from = settings.EMAIL_HOST_USER recipient_list = [email] send_mail(subject, message, email_from, recipient_list) return True
内容的提问来源于stack exchange,提问作者Aman Yadav
相关产品推荐
相关产品推荐

