开头
在做毕业设计时,想到用邮箱来对用户注册进行一个激活认证,只有该用户激活了才能进行登录,于是可以通过qq邮箱来进行一个简单的激活认证。
步骤
1.模型类文件操作
在用户模型类中添加两个字段:email
和is_active
。email字段用于保存用户的邮箱地址,is_active字段用于标识用户是否已激活。
class User(models.Model):
id = models.AutoField('id',primary_key=True)
username = models.CharField('用户名',max_length=255,default='')
password = models.CharField('密码',max_length=255,default='')
其它字段....
# 添加邮箱验证
email = models.EmailField('用户邮箱', max_length=255, default='')
is_active = models.IntegerField('是否激活',default=0) # 是否激活 0 未激活,1 激活
class Meta:
db_table = "user"
完成后,运行数据库迁移命令,将新字段添加到数据库中。
python manage.py makemigrations
python manage.py migrate
2.发送激活邮件
Django内置了一个简单的邮件发送功能,我们可以使用它来发送激活邮件。首先,在settings.py
文件中配置邮件服务器信息:
send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)
在大多数情况下,你可以使用django.core.mail.send_mail()
来发送邮件。
参数说明:
subject
:一个字符串,邮件的主题。message
:一个字符串,邮件的正文内容,纯文本格式。from_email
:字符串,发件人的邮箱地址。如果为None
,Django将使用DEFAULT_FROM_EMAIL
设置的值。recipient_list
:一个字符串列表,每项都是一个邮箱地址。recipient_list中的每个成员都可以在邮件的"收件人:"中看到其他的收件人。fail_silently
:一个布尔值。若为False
,send_mail()
会在发生错误时抛出smtplib.SMTPException
。可在smtplib
文档找到一系列可能的异常,它们都是SMTPException
的子类。auth_user
:可选的用户名,用于验证登录SMTP服务器。若未提供,Django会使用EMAIL_HOST_USER
指定的值。auth_password
:可选的密码,用于验证登录SMTP服务器。若未提供,Django会使用EMAIL_HOST_PASSWORD
指定的值。connection
:可选参数,发送邮件使用的后端。若未指定,则使用默认的后端。查询邮件后端文档获取更多细节。html_message
:若提供了html_message
,会使邮件成为multipart/alternative
的实例,message
的内容类型则是text/plain
,并且html_message
的内容类型是text/html
。
# 设置邮箱
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = '25'
EMAIL_HOST_USER = '######' # 当前发邮件的邮箱,这里填你自己的邮箱
EMAIL_HOST_PASSWORD = '######' # 这个密码是授权码
EMAIL_USE_TLS = True # 使用非加密协议
获取方式如下
A.先确定发件邮箱
B.开启服务
C.授权码
在注册视图中添加发送邮件的逻辑
def register(request):
if request.method == "GET":
return render(request, 'register.html')
else:
username = request.POST.get("username")
pwd = request.POST.get('password')
checkPwd = request.POST.get('checkPassword')
# 新增邮箱验证
email = request.POST.get('email')
# print(username,pwd,checkPwd)
try:
User.objects.get(username=username)
return errorResponse(request, '该用户名已被注册!!')
except User.DoesNotExist:
if not username or not pwd or not checkPwd:
return errorResponse(request,'用户名或密码为空!!')
if not email:
return errorResponse(request,errMsg='请输入邮箱!')
if pwd != checkPwd:
return errorResponse(request,'两次密码不正确!!')
else:
# 创建md5对象
md5 = hashlib.md5()
# 对字符串进行编码
md5.update(pwd.encode())
# 加密
pwd = md5.hexdigest()
# 存储用户
# 该用户未被激活
user = User.objects.create(username=username,password=pwd,email=email)
user.is_active = 0
user.save()
# 使用uuid产生一个token
token = str(uuid.uuid4()).replace('-','')
# 使用session存储token
# request.session[token] = user.id
request.session[str(token)] = str(user.id)
request.session.save() # 保存session到数据库或缓存
path = f'http://127.0.0.1:9995/bossApp/active?token={token}'
# 邮箱验证
subject = "计算机专业招聘信息与统计可视化网站激活邮件"
message = f"""
<html>
<head>
<style>
body {{
font-family: Arial, sans-serif;
background-color: #f2f2f2;
}}
.container {{
position: relative;
max-width: 600px;
margin: 0 auto;
padding: 20px;
background-color: #fff;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}}
h1 {{
color: #333;
font-size: 24px;
margin-bottom: 20px;
}}
p {{
color: #555;
font-size: 16px;
line-height: 1.5;
}}
a {{
color: #007bff;
text-decoration: none;
}}
a:hover {{
text-decoration: underline;
}}
p.signature {{
position: absolute;
bottom: 10px;
right: 30px;
color: #555;
font-size: 16px;
line-height: 1.5;
}}
</style>
</head>
<body>
<div class="container">
<h1>欢迎注册计算机专业招聘信息与统计可视化网站!</h1>
<p>点击链接开始激活使用:</p>
<p><a href="http://127.0.0.1:9996/bossApp/active?token={token}">点击激活</a></p>
<p>如果链接不可用,请复制以下内容到浏览器激活:</p>
<p>{path}</p>
<br>
<br>
<p class="signature">生夏</p>
</div>
</body>
</html>
"""
send_mail(subject=subject,message='',html_message=message,from_email=settings.EMAIL_HOST_USER,recipient_list=[email,])
# print("邮箱信息:",result)
return redirect('/bossApp/login')
3.激活账户
现在需要创建一个视图来处理激活链接。在urls.py
文件中,添加一个路由指向这个视图
urlpatterns = [
# 邮箱激活
path('active', views.active, name='active'),
]
在views.py
文件中,创建active视图:
def active(request):
token = request.GET.get('token')
print(token)
# 获取session中的值
uid = request.session.get(token)
# print('------>',uid)
user = User.objects.get(id=uid)
# 用户激活,一开始设置is_active = 0,然后判段is_active为0还是为1设置用户能否登录
user.is_active = 1
user.save()
return redirect('/bossApp/login')
4.效果
点击邮件连接后才能激活登录