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

如何实现Django超级管理员创建用户并发送登录凭证邮件?

实现管理员创建用户后发送登录凭证邮件的方案

以下是针对需求的具体实现步骤,全程基于你现有代码进行修改:

1. 配置Django邮件发送设置

首先在项目的settings.py中添加邮件配置,用于发送登录凭证邮件。如果只是测试,可以用控制台输出替代真实邮件:

# settings.py
# 测试用(邮件会打印到控制台)
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

# 生产环境用真实SMTP(示例为Gmail)
# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# EMAIL_HOST = 'smtp.gmail.com'
# EMAIL_PORT = 587
# EMAIL_USE_TLS = True
# EMAIL_HOST_USER = '你的管理员邮箱@example.com'
# EMAIL_HOST_PASSWORD = '邮箱密码或应用专用密码'
# DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

2. 编写邮件发送工具函数

在authentication应用下新建utils.py文件,封装发送登录凭证的逻辑:

# authentication/utils.py
from django.core.mail import send_mail
from django.conf import settings

def send_login_credentials_email(user, plain_password):
    """发送包含登录凭证的邮件给新创建的用户"""
    subject = '你的账号已创建,请登录'
    message = f'''
    你好 {user.first_name} {user.last_name}:
    
    管理员已为你创建账号,登录信息如下:
    登录邮箱:{user.email}
    登录密码:{plain_password}
    
    请尽快登录系统并修改密码。
    '''
    send_mail(
        subject=subject,
        message=message,
        from_email=settings.DEFAULT_FROM_EMAIL,
        recipient_list=[user.email],
        fail_silently=False,
    )

3. 修改UserAdmin,捕获创建用户事件发送邮件

管理员在后台创建用户时,需要捕获明文密码并触发邮件发送,修改admin.py:

# authentication/admin.py
from django.contrib import admin
from authentication.models import User
from authentication.utils import send_login_credentials_email

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = ("email", "first_name", "last_name")
    # 调整后台表单字段,让管理员必须输入密码
    fieldsets = (
        (None, {'fields': ('email', 'password', 'first_name', 'last_name')}),
        ('账号状态', {'fields': ('is_active', 'is_verified', 'is_staff', 'is_superuser')}),
        ('权限设置', {'fields': ('groups', 'user_permissions')}),
        ('时间信息', {'fields': ('created_at', 'updated_at')}),
    )
    readonly_fields = ('created_at', 'updated_at')

    def save_model(self, request, obj, form, change):
        # 判断是否是新建用户(change为False表示首次创建)
        if not change:
            # 获取管理员输入的明文密码
            plain_password = form.cleaned_data.get('password')
            # 先保存用户到数据库
            super().save_model(request, obj, form, change)
            # 发送登录凭证邮件
            send_login_credentials_email(obj, plain_password)
        else:
            # 修改用户时直接保存
            super().save_model(request, obj, form, change)

4. 测试功能

  1. 启动Django服务器,登录后台管理员账号
  2. 创建新用户,填写邮箱、密码、姓名等必填信息
  3. 提交后,查看目标邮箱(或控制台输出)是否收到登录凭证邮件
  4. 使用邮件中的邮箱和密码调用LoginAPIView,验证登录功能正常

补充说明

  • 因为数据库中存储的是哈希后的密码,所以必须在管理员创建用户时捕获明文密码,这也是为什么选择重写UserAdmin.save_model而不是用post_save信号的原因(信号无法获取明文密码)
  • 建议在邮件中提示用户登录后立即修改密码,后续可扩展密码重置功能增强安全性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:01:15