You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:06:03