如何实现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. 测试功能
- 启动Django服务器,登录后台管理员账号
- 创建新用户,填写邮箱、密码、姓名等必填信息
- 提交后,查看目标邮箱(或控制台输出)是否收到登录凭证邮件
- 使用邮件中的邮箱和密码调用
LoginAPIView,验证登录功能正常
补充说明
- 因为数据库中存储的是哈希后的密码,所以必须在管理员创建用户时捕获明文密码,这也是为什么选择重写
UserAdmin.save_model而不是用post_save信号的原因(信号无法获取明文密码) - 建议在邮件中提示用户登录后立即修改密码,后续可扩展密码重置功能增强安全性
内容的提问来源于stack exchange,提问作者se7en
相关产品推荐
相关产品推荐

