当前位置: 首页 > news >正文

使用celery+Redis+flask-mail发送邮箱验证码

Celery是一个分布式任务队列,它可以让你异步处理任务,例如发送邮件、图片处理、数据分析等。

在项目中和celery 有关系的文件如下:

task.py : 创建celery.py 对象,并且添加任务,和app绑定,注意:这里没有将celery放在app.py 文件中绑定,是为了防止出现循环引用的问题。

views.py: 调用celery 中的任务。

需要在config.py 中配置:

# celery 相关配置
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/0'
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'
# 邮箱配置信息
# MAIL_USE_TLS 端口号是587
# MAIL_USE_SSL 端口号是465
# QQ邮箱不支持非加密方式发送邮件
MAIL_SERVER = 'smtp.qq.com'
MAIL_USE_TLS = True
MAIL_PORT = 587
MAIL_USERNAME = "你的邮箱地址"
MAIL_PASSWORD = "你的邮箱密钥"
MAIL_DEFAULT_SENDER = "你的邮箱地址"

注意:我这里使用的是qq邮箱的配置,需要在邮箱的账号与安全里面去生成授权码

task.py 代码如下:

from celery import Celery
from flask import Flask
from flask_mail import Mail, Message
from exts import mail
import configapp = Flask(__name__)
app.config.from_object(config)mail.init_app(app)def make_celery(app):celery = Celery(app.import_name, backend=app.config['CELERY_RESULT_BACKEND'],broker=app.config['CELERY_BROKER_URL'])celery.conf.update(app.config)TaskBase = celery.Taskclass ContextTask(TaskBase):abstract = Truedef __call__(self, *args, **kwargs):with app.app_context():return TaskBase.__call__(self, *args, **kwargs)celery.Task = ContextTaskreturn celerycelery = make_celery(app)@celery.task
def send_mail(subject, recipients, body):message = Message(subject=subject, recipients=recipients, body=body)mail.send(message)

views.py :

import random
import stringfrom flask import Blueprint, render_template, request, jsonify
from task import send_emailbp = Blueprint('front', __name__, url_prefix='/')@bp.route('/email/captcha/', methods=['GET'])
def email_captcha():email = request.args.get('email')sample = string.digits + string.ascii_lowercasecaptcha = "".join(random.sample(sample, 4))if email:send_email.delay(subject='CMS论坛邮箱修改', recipients=[email], body=captcha)return jsonify({"code": 200, "message": "获取验证码成功!", "data": captcha})else:return jsonify({"code": 400, "message": "获取验证码失败!", "data": None})

在页面中访问:http://127.0.0.1:5000/email/captcha/?email=你要发送的邮箱地址 就可以测试发送邮箱验证码。

发送验证码之前一定要启动redis!!!

页面输出的结果是:

{"code": 200,"data": "p2fv","message": "\u83b7\u53d6\u9a8c\u8bc1\u7801\u6210\u529f\uff01"
}

监听celery:在终端输入   celery -A task.celery worker --pool=solo --loglevel=info

http://www.lryc.cn/news/447792.html

相关文章:

  • 【第十四章:Sentosa_DSML社区版-机器学习之时间序列】
  • Vue3.X + SpringBoot小程序 | AI大模型项目 | 饮食陪伴官
  • 【C++】检测TCP链接超时——时间轮组件设计
  • 中国新媒体联盟与中运律师事务所 建立战略合作伙伴关系
  • 【ArcGIS微课1000例】0121:面状数据共享边的修改方法
  • 图论(dfs系列) 9/27
  • 如何在Windows上安装Docker
  • golang格式化输入输出
  • Jenkins基于tag的构建
  • 性能设计模式
  • Android 热点分享二维码功能简单介绍
  • SIEM之王,能否克服创新者的窘境?
  • (JAVA)浅尝关于 “栈” 数据结构
  • 【前端】ES13:ES13新特性
  • vuepress 浏览器加载缓存,总是显示旧页面,无法自动刷新数据的解决方法
  • 如何使用代理IP解决反爬虫问题
  • QT学习笔记之绘图
  • 大数据新视界 --大数据大厂之数据清洗工具 OpenRefine 实战:清理与转换数据
  • 基于QT的C++中小项目软件开发架构源码
  • self-supervised, weakly supervised, and supervised respectively区别
  • 安卓好软-----手机屏幕自动点击工具 无需root权限
  • 【Redis】主从复制(下)--主从复制原理和流程
  • Pencils Protocol上线 Vaults 产品,为 $DAPP 深入赋能
  • uni-app+vue3+pina实现全局加载中效果,自定义全局变量和函数可供所有页面使用
  • 基于SSM+小程序的在线课堂微信管理系统(在线课堂1)(源码+sql脚本+视频导入教程+文档)
  • Uniapp 微信小程序 最新 获取用户头像 和 昵称 方法 有效可用
  • 儿童手抄报模板-200个(家有神兽必备)
  • 动态规划入门题目->使用最小费用爬楼梯
  • 中间添加一条可以拖拽的分界线,来动态调整两个模块的宽度
  • C++的vector优化