Django中自定义HTML表单注册后如何发送验证邮件?
实现自定义表单下的Django注册验证邮件功能
完全不依赖Django原生表单,仅需要修改后端逻辑即可实现,步骤如下:
1. 先配置settings.py邮件参数
# settings.py 追加以下配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.qq.com' # 用163邮箱则替换为smtp.163.com EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = '你的邮箱地址@qq.com' EMAIL_HOST_PASSWORD = '你的邮箱SMTP授权码' # 注意不是邮箱登录密码,是邮箱后台开通SMTP服务时生成的授权码 DEFAULT_FROM_EMAIL = EMAIL_HOST_USER # 站点域名,生产环境替换为实际线上域名 SITE_DOMAIN = '127.0.0.1:8000'
本地测试不想真发邮件的话,可以把EMAIL_BACKEND改成django.core.mail.backends.console.EmailBackend,邮件内容会直接打印在控制台,方便调试。
2. 编写验证邮件发送逻辑
不需要额外安装依赖,直接用Django自带的签名模块生成防篡改的验证链接,在你现有views.py里追加以下代码:
# views.py 开头追加导入 from django.core.signing import Signer, BadSignature from django.core.mail import send_mail from django.conf import settings from django.contrib.auth.models import User # 封装发验证邮件的函数 def send_verification_email(user): # 生成带签名的用户ID,防止篡改 signer = Signer() signed_user_id = signer.sign(user.id) # 拼接验证链接 verify_url = f"http://{settings.SITE_DOMAIN}/verify-email/{signed_user_id}/" # 邮件内容 subject = '请激活你的账号' message = f'你好 {user.first_name},请点击以下链接激活你的账号:{verify_url},链接24小时内有效' # 发送邮件 send_mail( subject=subject, message=message, from_email=settings.DEFAULT_FROM_EMAIL, recipient_list=[user.email], fail_silently=False )
3. 修改你现有的signup视图
两个核心改动:创建用户时默认设置is_active=False(未验证用户无法登录),用户保存完成后调用发邮件函数,修改后代码如下:
def signup(request): if request.method == "POST": username=request.POST['username'] firstname=request.POST['firstname'] lastname=request.POST['lastname'] email=request.POST['email'] password=request.POST['password1'] if User.objects.filter(username=username).exists() : messages.error(request, "用户名已存在") return redirect(request.META['HTTP_REFERER']) elif User.objects.filter(email=email).exists(): messages.error(request,"该邮箱已绑定其他账号") return redirect(request.META['HTTP_REFERER']) else: # 创建用户时指定is_active为False,未验证用户禁止登录 myuser = User.objects.create_user(username, email, password, is_active=False) myuser.first_name= firstname myuser.last_name= lastname myuser.save() # 调用发验证邮件函数 send_verification_email(myuser) messages.success(request, "你的账号已创建成功,请前往邮箱验证后登录") return redirect(request.META['HTTP_REFERER'])
4. 编写邮件验证回调视图
用户点击邮件里的链接会访问这个视图,完成账号激活:
# views.py 追加验证视图 def verify_email(request, signed_user_id): signer = Signer() try: # 解密签名拿到用户ID user_id = signer.unsign(signed_user_id) user = User.objects.get(id=user_id) # 激活用户 user.is_active = True user.save() messages.success(request, "账号验证成功,可以登录了") return redirect('login') # 替换为你自己的登录页路由名 except (BadSignature, User.DoesNotExist): messages.error(request, "验证链接无效或已过期") return redirect('signup') # 替换为你自己的注册页路由名
5. 配置urls.py路由
把验证接口加到你的urlpatterns里:
# urls.py from django.urls import path from . import views urlpatterns = [ # 保留你原有注册、登录等路由,追加下面这行 path('verify-email/<str:signed_user_id>/', views.verify_email, name='verify_email'), ]
如果需要给验证链接加过期时间,把Signer换成TimestampSigner,解密的时候指定max_age参数即可。你现有自定义HTML表单的逻辑完全不需要修改,直接复用即可。
内容的提问来源于stack exchange,提问作者Labhroop singh
相关产品推荐
相关产品推荐

