Django邮箱设置

2019-09-20  本文已影响0人  叶扬风起

设置邮箱

邮箱设置1
邮箱设置2

setting文件

#邮箱设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

# 发送邮箱验证码
EMAIL_HOST = 'smtp.163.com'     # 服务器
EMAIL_PORT = 25                 # 一般情况下都为25
EMAIL_HOST_USER = "yeyangfengqi@163.com"     # 账号
EMAIL_HOST_PASSWORD = "*******"          # 密码 (注意:这里的密码指的是授权码)
EMAIL_USE_TLS = True       # 一般都为False
EMAIL_FROM = "yeyangfengqi@163.com"      # 邮箱来自
#end邮箱设置

用于存放验证码的model

记得注册你的项目中

# 邮箱验证
class EmailVerifyRecord(models.Model):
    # 验证码
    code = models.CharField(max_length=20, verbose_name="验证码")
    email = models.EmailField(max_length=50, verbose_name="邮箱")
    # 包含注册验证和找回验证
    send_type = models.CharField(verbose_name="验证码类型", max_length=10,
                                 choices=(("register", "注册"), ("forget", "找回密码")))
    send_time = models.DateTimeField(verbose_name="发送时间", default=datetime.datetime.now())

    class Meta:
        verbose_name = u"邮箱验证码"
        verbose_name_plural = verbose_name

    def __unicode__(self):
        return '{0}({1})'.format(self.code, self.email)
#end邮箱验证

发送邮件脚本编写 emial_send.py

# @Time    : 2019/9/20 9:32
# @Author  : Yeyangfengqi
# @Site    : 
# @File    : email_send.py.py
# @Software: PyCharm
# @effect  : 邮件发送

from random import Random  # 用于生成随机码
from django.core.mail import send_mail  # 发送邮件模块
from django.conf import settings    # setting.py添加的的配置信息
from ..models import EmailVerifyRecord  # 邮箱验证model
import datetime

# 生成随机字符串
def random_str(randomlength=8):
    """
    随机字符串
    :param randomlength: 字符串长度
    :return: String 类型字符串
    """
    str = ''
    # 验证码包含字符
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    length = len(chars) - 1
    random = Random()
    # 随机产生字符
    for i in range(randomlength):
        str += chars[random.randint(0, length)]
    return str

def send_code_email(email, send_type='register'):
    """
    :param emial:
    :param send_type:
    :return: True/False
    """
    #实例化表
    email_record = EmailVerifyRecord()
    # 将给用户发的信息保存在数据库中
    #获取随机验证码
    code = random_str(8)
    #保存验证码
    email_record.code = code
    email_record.email = email
    email_record.send_type = send_type
    email_record.send_time = datetime.datetime.now()
    email_record.save()

    # 初始化为空
    email_title = ""
    email_body = ""
    # 判断使用邮箱类型
    # 如果为注册类型
    if send_type == "register":
        email_title = "注册激活"
        # email_body = "请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code)
        email_body = "您的邮箱注册验证码为:{0}, 该验证码有效时间为两分钟,请及时进行验证。".format(code)
        #发送邮件
        send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email])
        if not send_status:
            return False
    if send_type == "retrieve":
        email_title = "找回密码"
        email_body = "您的邮箱注册验证码为:{0}, 该验证码有效时间为两分钟,请及时进行验证。".format(code)
        # 发送邮件
        send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email])
        if not send_status:
            return False
    return True

view视图中的使用

使用前记得导入emial_send.py

定义发送函数
def user_register_send_emial(request):
    if request.method == "GET":
        email = request.GET.get('email', default='')
        send_code_email(email)
        message = "发送成功"
        return JsonResponse({"state": True, "message": message})

在url中添加path

path('register_send_emial', views.user_register_send_emial, name='register_send_emial'),

使用时,在前端点击按钮,ajax请求这个路径,就可以直接发送邮件了。

验证验证码
def user_register(request):
    if request.method == "POST":
        #获取前端json数据
        postBody = json.loads(request.body)
        #赋值
        email, username, pwd1, pwd2, smscode = postBody['email'], postBody['username'], postBody['pass'], postBody['checkPass'], postBody['smscode']
        #验证码过期时间,思路是当前时间的前1个小时内的验证码
        check_time = datetime.datetime.now() - datetime.timedelta(hours=1)
        #查询验证码数据
        check_smscode = EmailVerifyRecord.objects.filter(code=smscode).filter(email=email).filter(send_time__gt=check_time).filter(send_type='register')
        #如果不存在,返回错误
        if (check_smscode):
            pass
        else:
            message = "验证码错误!"
            return JsonResponse({"state": False, "message": message})

使用效果

后端使用效果

前端是我用Vue写的,直接跳转到登陆界面了。。。


前端效果
上一篇下一篇

猜你喜欢

热点阅读