Django邮件发送 注册登录
一、邮件发送
设置临时环境变量
windows下
设置
set 名称=值
获取
set 名称
Linux下
设置
export 名称=值
获取
echo $名称
实例:
export xlg=lucky
echo $xlg
扫描二维码关注公众号,回复:
8648064 查看本文章
配置settings.py
# 配置发送邮件所需的配置
EMAIL_HOST = 'smtp.1000phone.com' # smtp服务器
EMAIL_HOST_PASSWORD = os.environ.get('MAIL_PASSWORD') # 邮箱密码或授权码
EMAIL_HOST_USER = os.environ.get('MAIL_USER') # 用户名
(1) 发送单人邮件
# 发送一封邮件
# 发送纯文本邮件
"""
def sendMail(req):
send_mail(
'帅气的lucky老师啊',
'买个冰送个棍 一口一个大牙印 学习python找lucky老师',
# settings.EMAIL_HOST_USER,
os.environ.get('MAIL_USER'),
['[email protected]'],
fail_silently=False,
)
return HttpResponse('发送邮件')
"""
# 发送纯html邮件
def sendMail(req):
send_mail(
'帅气的lucky老师啊',
'',
os.environ.get('MAIL_USER'),
['[email protected]'],
html_message = '<a href="http://www.codingke.com">扣丁课堂</a>',
fail_silently=False,
)
return HttpResponse('发送邮件')
(2) 发送多人邮件
# 发送多人邮件
def send_many_email(req):
message1 = ('Subject here', 'Here is the message', os.environ.get('MAIL_USER'), ['[email protected]', '[email protected]'])
# message2 = ('Another Subject', 'Here is another message', '[email protected]', ['[email protected]'])
send_mass_mail((message1,), fail_silently=False)
return HttpResponse('给多人发送邮件')
datatuple = (
('Subject', 'Message.', '[email protected]', ['[email protected]']),
('Subject', 'Message.', '[email protected]', ['[email protected]']),
)
send_mass_mail(datatuple)
注意:
只能发送文本邮件 不能发送html-message html内容
send_mail与send_mass_mail的区别
send_mass_mail()和send_mail()的主要区别在于send_mail()每次执行时都会打开与邮件服务器的连接,而send_mass_mail()对所有邮件都使用一个连接。这使得发送\u mass\u mail()的效率略高
(3) 发送多人HTML邮件
# 发送多人 HTML格式的邮件
def ema(req):
subject, from_email, to = 'hello', os.environ.get('MAIL_USER'), '[email protected]'
text_content = ''
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
return HttpResponse('发送邮件')
二、登录注册
注册功能步骤:
- 创建用户模型
- 创建视图路由地址和视图函数
- 创建模板
- 数据进行处理
- token值进行邮件激活的发送
- 渲染邮件激活模板
- 邮件激活
- 改变用户状态
(1) 创建注册用户的模型
# 用户表
class User(models.Model):
username = models.CharField(max_length=20,unique=True,db_index=True,default='lucky',verbose_name='用户名')
password_hash = models.CharField(max_length=140)
sex = models.BooleanField(default=True,verbose_name='性别')
age = models.IntegerField(default=18,verbose_name='年龄')
email = models.CharField(max_length=50,unique=True,verbose_name='注册邮件')
createtime = models.DateTimeField(auto_now_add=True,verbose_name='加入时间')
confirm = models.BooleanField(default=False,verbose_name='激活状态')
def __str__(self):
return self.username
(2) 创建视图函数
def register(req):
return HttpResponse('注册')
(3) 创建模板
{% extends 'common/base.html' %}
{% block title %}
注册
{% endblock %}
{% block pagecontent %}
<h4>注册</h4>
<form action="" method="post">
{% csrf_token %}
<p>用户名: <input type="text" name="username"></p>
<p>密码: <input type="password" name="userpass"></p>
<p>激活的邮箱: <input type="text" name="email"></p>
<p><input type="submit" value="注册"></p>
</form>
{% endblock %}
(4) 添加生成hash加密的方法
内置hash加密方法 使用导入即可
导入
from django.contrib.auth.hashers import make_password,check_password
from django.contrib.auth.hashers import make_password,check_password
# 测试hash加密
def test_hash(req):
password_hash = make_password('123456')
# print(password_hash)
print(check_password('1234567',password_hash))
return HttpResponse('测试hash加密密码')
加密实例
from django.contrib.auth.hashers import make_password,check_password
from django.db import models
# 用户表
class User(models.Model):
...
# 密码加密处理的类装饰器
@property
def password(self):
raise AttributeError
@password.setter
def password(self,password):
# 密码机密处理
self.password_hash = make_password(password)
# 验证码密码
def check_password(self,password):
return check_password(password,self.password_hash)
(5) 生成token与token验证
作用:
当用户进行请求激活时 用以区分是哪个用户进行的激活操作 功能原理类似session的存储获取操作
导入cache模块
from django.core.cache import cache
import uuid,hashlib
# 生成token方法
def generate_token(self):
u = uuid.uuid4()
# 拿到唯一的uuid字符串值 并进行编码
Str = str(u).encode('utf-8')
md5 = hashlib.md5()
md5.update(Str)
token = md5.hexdigest()
# 设置缓存 用户进行请求的字符串为生成的为一字符串作为缓存的key 在1小时内有效
cache.set(token,{'id':self.id},3600)
print(token)
return token
# 验证邮件的激活
@staticmethod
def check_token(token):
try:
# 根据缓存的key 取出id
id = cache.get(token)['id']
u = User.objects.get(pk=id)
u.confirm = True
u.save()
return True
except:
return False
(6) 配置邮件发送
# 进行token生成 发送邮件激活码
token = u.generate_token()
# 生成激活的链接地址href
href = 'http://'+req.get_host()+reverse('App:active',args=[token])
# 进行发送邮件的处理
html_content = loader.get_template('user/active.html').render({'href':href,'username':u.username})
# 配置发送邮件
subject, from_email, to = '邮件激活', os.environ.get('MAIL_USER'), u.email
text_content = ''
html_content = html_content
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
邮件激活模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>邮件激活</title>
</head>
<body>
<h4>欢迎:{{ username }}</h4>
<h5>欢迎注册本网站! 您还差最后一步激活操作 就可以完成网站的注册了 请快快点击右侧的激活链接地址 加入我们吧!<a href="{{ href }}" target="blank">激活</a></h5>
</body>
</html>
(7) 完整的注册功能
from django.core.mail import EmailMultiAlternatives
from django.db.models import Q
from django.shortcuts import render,HttpResponse,reverse,redirect
# 导入用户需要的USER模型
from App.models import User
from django.contrib import messages
from django.template import loader
import os
# 注册视图函数
def register(req):
# 判断请求的方式
if req.method == 'POST':
# 进行数据的处理
u = User.objects.filter(Q(username=req.POST.get('username'))|Q(email=req.POST.get('email')))
if u.exists():
messages.error(req, '用户名或邮箱地址已存在请重新输入')
else:
try:
u = User()
u.username = req.POST.get('username')
u.password = req.POST.get('userpass')
u.email = req.POST.get('email')
u.save()
except:
messages.error(req, '目前服务器繁忙 请稍后再次操作')
else:
# 进行token生成 发送邮件激活码
token = u.generate_token()
# 生成激活的链接地址href
href = 'http://'+req.get_host()+reverse('App:active',args=[token])
# 进行发送邮件的处理
html_content = loader.get_template('user/active.html').render({'href':href,'username':u.username})
# 配置发送邮件
subject, from_email, to = '邮件激活', os.environ.get('MAIL_USER'), u.email
text_content = ''
html_content = html_content
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
messages.success(req,'注册成功 激活邮件已经发送 请前去激活~')
return render(req,'user/register.html')
(8) 完整的激活路由视图函数
# 激活视图函数
def active(req,token):
if User.check_token(token):
messages.success(req,'账户激活成功!请前去登录~')
return redirect(reverse('App:login'))
else:
messages.error(req,'账户激活失败! 请重新进入账户激活的操作')
return redirect(reverse('App:register'))
(9)完整的models模型
from django.contrib.auth.hashers import make_password,check_password
from django.db import models
from django.core.cache import cache
import uuid,hashlib
# 用户表
class User(models.Model):
username = models.CharField(max_length=20,unique=True,db_index=True,default='lucky',verbose_name='用户名')
password_hash = models.CharField(max_length=140)
sex = models.BooleanField(default=True,verbose_name='性别')
age = models.IntegerField(default=18,verbose_name='年龄')
email = models.CharField(max_length=50,unique=True,verbose_name='注册邮件')
info = models.CharField(max_length=20,default='我是帅气的lucky老师',verbose_name='简介')
createtime = models.DateTimeField(auto_now_add=True,verbose_name='加入时间')
confirm = models.BooleanField(default=False,verbose_name='激活状态')
def __str__(self):
return self.username
# 密码加密处理的类装饰器
@property
def password(self):
raise AttributeError
@password.setter
def password(self,password):
# 密码机密处理
self.password_hash = make_password(password)
# 验证码密码
def check_password(self,password):
return check_password(password,self.password_hash)
# 生成token方法
def generate_token(self):
u = uuid.uuid4()
# 拿到唯一的uuid字符串值 并进行编码
Str = str(u).encode('utf-8')
md5 = hashlib.md5()
md5.update(Str)
token = md5.hexdigest()
# 设置缓存 用户进行请求的字符串为生成的为一字符串作为缓存的key 在1小时内有效
cache.set(token,{'id':self.id},3600)
print(token)
return token
# 验证邮件的激活
@staticmethod
def check_token(token):
try:
# 根据缓存的key 取出id
id = cache.get(token)['id']
u = User.objects.get(pk=id)
u.confirm = True
u.save()
return True
except:
return False
(10) 完整的登录功能视图函数
# 登录视图函数
def login(req):
if req.method == 'POST':
query_u = User.objects.filter(Q(username=req.POST.get('username'))|Q(email=req.POST.get('email')))
u = query_u.first()
if not query_u.exists():
# 验证用户是否存在
messages.error(req,'请输入正确的用户名或密码')
return render(req, 'user/login.html')
elif not u.check_password(req.POST.get('userpass')):
# 验证密码
messages.error(req,'请输入正确的用户名或密码')
elif not u.confirm:
# 验证当前账户是否激活
messages.error(req,'您的账户还没有激活 请前去激活再次登录')
else:
# 证明该用户存在 密码正确 并且已经为激活状态
# 处理当前用户的状态保持
req.session['uid'] = u.id
req.session['username'] = u.username
messages.success(req,'登录成功~')
return redirect(reverse('App:login'))
return render(req,'user/login.html')