8.python发送邮箱验证码——使用zmail发送邮件验证用户信息
创始人
2024-04-05 10:52:43

1.邮件工具类封装

1.1概述

在我们的注册页面时,会需要一个发送邮件的功能去验证邮箱号是否正确,同样的,可以避免一些用户恶意的注册导致数据库出现问题在这里插入图片描述
这里将使用zmail的第三方库去实现发送邮件的功能:zmail官方网址

1.2实现功能流程

  1. 安装zmail
pip install zmail
  1. 去到邮箱中开启服务IMAP/SMTP服务 (什么是 IMAP,它又是如何设置?)
    在这里插入图片描述
  2. 获取到授权码进行填写到代码中

1.3封装代码实现

# forum/utils/email_utils.py
import zmail
# 'qzjwvrycoxovhgfh'
def send_mail(from_mail:str, passwd:str, to_mail:str, subject:str, text:str) -> None:server = zmail.server(from_mail,passwd)server.send_mail(to_mail,{'subject':subject,'content_text':text})

2.邮件接口开发

在这里插入图片描述

2.1概述

当我们点击发送验证码时,需要一个接口去调用我们的封装好的邮件工具类去实现此功能。

2.2Tornado创建控制器

# forum/handler/UserHandler.py
from forum.wtforms import UserForm
from forum import manager
from forum.models import UserModel
from uuid import uuid4
from forum.handler.BaseHandler import BaseHandler
from forum.utils.email_utils import send_mail
from random import randint
from config import email# 发送邮件
class SendEmailHandler(BaseHandler):# 用于给定4位随机验证码def generate_code(self) -> int:return randint(1000,9999)# 发送邮件的接口def post(self):user_email = self.get_body_argument('email') # 获取前端form输入框中输入的邮箱msg = f'您好,您正在使用{user_email}注册用户注册账号,您的验证码位{self.generate_code()},如果不是本人操作,请忽略'send_mail(email.get('uname'),email.get('pwd'),user_email,'用户注册',msg)

2.3挂载路由

# router.py
from forum.handler import BaseHandler,UserHandler
handlers = [('/',BaseHandler.IndexHandler),('/api/user/add/?', UserHandler.AddUserHandler),('/api/send_msg/?', UserHandler.SendEmailHandler)
]

2.4发送地址参数文件

# config.pyemail = {'uname':'1339559006@qq.com','pwd':'qzjwvrycoxovhgfh'
}

3.效果展示

在这里插入图片描述

4.发送验证码_验证码保存

4.1概述

当我们想要注册时,必须先发送验证码(下一步再进行验证),发送完成,我们应该把数据保存到数据库中,但是这里的数据并不是特别重要,所以会放在缓存类型的数据库redis,最后在进行验证码的比对。这里,我们就实现如何将数据保存到redis中。

4.2连接数据库redis

在这里插入图片描述

4.3安装redis第三方库

网址如下:官方网址

pip install redis

4.4连接虚拟机中的redis数据库

在虚拟机开启服务后,连接数据库redis,具体的redis配置方法太多了,就不在这一一介绍啦
在这里插入图片描述

4.5测试数据库连接代码

# 测试:redis数据库是否可使用
def test_redis_db():import redis# 连接数据库client = redis.Redis(host='192.168.188.128',port=6379,db=0)# 添加数据client.set('name','bjsxt')print(client.get('name'))

在这里插入图片描述

4.6 保存数据到redis,从redis获取数据

# forum/utils/redis_utils.pyimport redis# 保存数据到redis
def save_code(email:str, code:str)->None:client = redis.Redis(host='192.168.188.128', port=6379,db=0)client.set(email, code)# 从redis获取数据
def get_code(email:str) ->str:client = redis.Redis(host='192.168.188.128',port=6379,db=0)code = client.get(email)if code:return code.decode()else:return ''

4.7验证数据代码完整版

# forum/handler/UserHandler.py
from forum.wtforms import UserForm
from forum import manager
from forum.models import UserModel
from uuid import uuid4
from forum.handler.BaseHandler import BaseHandler
from forum.utils.email_utils import send_mail
from forum.utils.redis_utils import *
from random import randint
from config import email# 调用wtforms做添加用户数据之前的数据表单验证
class AddUserHandler(BaseHandler):async def post(self):# 创建应该响应对象rs_data = {}# 接受请求的参数并封装到Form对象中user_form = UserForm(self.request.arguments)# 前端传递的验证码code = self.get_body_argument('code')# 后端的正确的验证码db_code = get_code(user_form.email.data)if code == db_code:if user_form.validate():# 从表单中获取email信息email = user_form.email.datatry:# 异步查询数据表信息exist_user = await manager.get(UserModel,email = email)if exist_user:# 存在此用户,验证失败rs_data['code'] = 500rs_data['msg'] = '用户名已存在'except Exception as e:# 验证成功# 异步保存数据到数据库中user_form.id.data = uuid4()await manager.create(UserModel,**user_form.data)rs_data['code'] = 200rs_data['msg'] = '注册成功'else:# 验证失败rs_data['code'] = 500rs_data['msg'] = '注册失败'# 将验证失败的具体原因返回给rs_data,提示信息for f in user_form.errors:rs_data[f] = user_form.errors[f][0]else:# 验证失败rs_data['code'] = 500rs_data['msg'] = '验证码错误'self.finish(rs_data)# 发送邮件
class SendEmailHandler(BaseHandler):# 用于给定4位随机验证码def generate_code(self) -> int:return randint(1000,9999)# 发送邮件的接口def post(self):user_email = self.get_body_argument('email') # 获取前端form输入框中输入的邮箱code = self.generate_code()msg = f'您好,您正在使用{user_email}注册用户注册账号,您的验证码位{code},如果不是本人操作,请忽略'send_mail(email.get('uname'),email.get('pwd'),user_email,'用户注册',msg)save_code(user_email,code)

4.8效果展示

在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...