Django邮件发送,登陆注册

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('发送邮件')

二、登录注册

注册功能步骤:

  1. 创建用户模型
  2. 创建视图路由地址和视图函数
  3. 创建模板
  4. 数据进行处理
  5. token值进行邮件激活的发送
  6. 渲染邮件激活模板
  7. 邮件激活
  8. 改变用户状态

(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')
发布了58 篇原创文章 · 获赞 0 · 访问量 512

猜你喜欢

转载自blog.csdn.net/qq_41170489/article/details/103436964