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

Django中管理员创建新用户时如何自动发送密码重置邮件?

Django实现新建用户后自动发送密码重置邮件方案

1. 前提配置:邮件服务参数

首先需要在项目settings.py中配置正确的SMTP邮件发送参数,示例如下:

# settings.py 邮件配置示例
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = '你的SMTP服务器地址'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = '发件人邮箱地址'
EMAIL_HOST_PASSWORD = '发件人邮箱授权码'
DEFAULT_FROM_EMAIL = '站点管理员 <发件人邮箱地址>'

本地测试时可以临时把EMAIL_BACKEND改为django.core.mail.backends.console.EmailBackend,邮件会直接输出在控制台方便调试。

2. 视图代码修改

首先在视图文件头部导入依赖工具:

from django.contrib.auth.tokens import default_token_generator
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.http import urlsafe_base64_encode
from django.utils.encoding import force_bytes
from django.urls import reverse

然后修改newmember视图逻辑,在用户和关联Member模型保存成功后新增密码重置邮件发送逻辑:

def newmember(request):
    if request.method == 'POST':
        nu_form = NewUser(request.POST)
        nm_form = NewMember(request.POST)
    
        if nu_form.is_valid() and nm_form.is_valid():
            # 先暂存用户对象,设置无效密码避免无密码可登录的安全问题
            nusave = nu_form.save(commit=False)
            nusave.set_unusable_password()
            nusave.save()
            
            nmsave = nm_form.save(commit = False)
            nmsave.user = nusave
            nmsave.save()
            
            # ------ 新增密码重置邮件发送逻辑 ------
            current_site = get_current_site(request)
            # 生成密码重置链接的校验参数
            uidb64 = urlsafe_base64_encode(force_bytes(nusave.pk))
            token = default_token_generator.make_token(nusave)
            # 拼接完整的重置链接
            reset_url = request.build_absolute_uri(
                reverse('password_reset_confirm', kwargs={'uidb64': uidb64, 'token': token})
            )
            # 构造邮件内容
            mail_subject = '你的站点账户已创建,请设置登录密码'
            mail_content = render_to_string('email/password_reset_invite.html', {
                'user': nusave,
                'reset_url': reset_url,
                'site_name': current_site.name,
            })
            # 发送邮件
            send_mail(
                subject=mail_subject,
                message=mail_content,
                from_email=None,
                recipient_list=[nusave.email],
                fail_silently=False,
            )
            
            return redirect(members)
        else:
            print(nu_form.errors)
            print(nm_form.errors)
    
    else:
        nu_form = NewUser()
        nm_form = NewMember()
    context = {
        'nu_form': nu_form, 
        'nm_form': nm_form
    }
    return render(request, 'web/newmember.html', context)

3. 补充说明

  • 需要自行创建邮件模板templates/email/password_reset_invite.html,可按照业务需求自定义内容,示例如下:
你好 {{ user.username }}:
管理员已为你在{{ site_name }}创建了账户,请点击以下链接设置你的登录密码:
{{ reset_url }}
如果链接无法点击,请复制到浏览器地址栏访问,链接24小时内有效。
  • 确保项目路由中已经配置了Django自带的认证路由,只要包含path('accounts/', include('django.contrib.auth.urls'))就可以正常使用password_reset_confirm视图。
  • 如果需要避免邮件发送阻塞请求,可以使用Celery等异步任务工具把邮件发送逻辑改为异步执行。

内容的提问来源于stack exchange,提问作者overclock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:06:03