Django用户注册确认邮件无法发送问题排查求助
Django注册确认邮件发送失败排查方案
我在开发服务时设置了用户注册后发送确认邮件的功能,用户可正常完成注册,但确认邮件始终无法发送。以下是相关代码:
views.py
def signup_view(request): if request.method == "POST": first_name= request.POST.get('first_name') last_name = request.POST.get('last_name') email = request.POST.get('email', 'default user') phone = request.POST.get('phone') password1= request.POST.get('password1') password2= request.POST.get('password2') userHash= email.replace('@','') # userHash =~ s/'@'//g #new =User.objects.filter(username = userHash) if password1 != password2: return render(request, 'signup.html',{'error_message': ' Passwords Different'}) else: user = User.objects.create_user((userHash, password1)) user.save() login(request, user) current_site = get_current_site(request) user = request.user email = request.user.email subject = "Verify Email" message = render_to_string('account/verify_email_message.html', { 'user': user, 'domain': current_site.domain, 'uid':urlsafe_base64_encode(force_bytes(user.pk)), 'token':account_activation_token.make_token(user), }) email = EmailMessage( subject, message, to=[email] ) email.send() return HttpResponse("Please Confirm your email address to complete the registration") and render(request,'account/landing.html') else: form = CreateUserForm() context = { 'form': form } return render(request, 'account/signup.html', context) def activate(request, uidb64, token): try: uid = force_str(urlsafe_base64_decode(uidb64)) user = User.objects.get(pk=uid) except(TypeError, ValueError, OverflowError, User.DoesNotExist): user = None if user is not None and account_activation_token.check_token(user, token): user.is_active = True user.save() return HttpResponse("Thank you for this confirmation") and redirect('account/index.html') else: messages.warning(request, 'The link is invalid.') return render(request, 'account/index.html') def home(request): return render(request, 'account/index.html')
settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = "smtp.gmail.com" EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = "myjarwiz2024@gmail.com" # - GMAIL email address EMAIL_HOST_PASSWORD = 'redacted' # - APP password DEFAULT_FROM_EMAIL = 'Jarwiz myjarwiz2024@gmail.com' # - GMAIL email address
问题排查与修复建议
用户对象邮箱未正确赋值:
创建用户时,User.objects.create_user((userHash, password1))参数格式错误,且未将表单中获取的email、first_name、last_name绑定到用户对象,导致request.user.email为空,邮件无收件人。修改代码:user = User.objects.create_user(userHash, password1) user.first_name = first_name user.last_name = last_name user.email = email # 绑定表单获取的邮箱 user.save()邮件收件人变量被覆盖:
代码中先通过email = request.POST.get('email', 'default user')获取了用户邮箱,后续又赋值email = request.user.email,此时用户邮箱尚未存入数据库,导致收件人变为空。直接使用最初获取的email变量即可。Gmail SMTP配置修正:
DEFAULT_FROM_EMAIL格式错误,正确写法为"Jarwiz <myjarwiz2024@gmail.com>",确保发件人格式符合邮件标准。- 确认已开启Google账号2步验证,且使用的是应用专用密码(而非普通登录密码)。
- 可临时切换
EMAIL_BACKEND为django.core.mail.backends.console.EmailBackend,在控制台查看邮件是否正常生成,判断是发送环节还是内容/收件人环节的问题。
视图返回逻辑错误:
return HttpResponse("xxx") and render(...)不符合Python逻辑,and会返回最后一个真值,实际只会执行render。建议合并提示信息到模板:return render(request, 'account/landing.html', { 'message': 'Please Confirm your email address to complete the registration' })激活视图中的类似错误同样修正:
messages.success(request, "Thank you for this confirmation") return redirect('home') # 使用URL名称而非模板路径
内容的提问来源于stack exchange,提问作者Sneha_R
相关产品推荐
相关产品推荐

