django中使用celery异步发送邮件
申请163网易发送邮件权限



在django中settings配置文件
#配置邮件服务器
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 指定邮件后端
EMAIL_HOST = 'smtp.163.com' # 发邮件主机
EMAIL_PORT = 25 # 发邮件端口
EMAIL_HOST_USER = '填你自己的邮箱' # 授权的邮箱
EMAIL_HOST_PASSWORD = '授权时候获得的那个密码' # 邮箱授权时获得的密码,非注册登录密码
EMAIL_FROM = '随便填一点<填你的邮箱>' # 发件人抬头
EMAIL_USE_TLS = False # 是否使用安全协议传输
创建celery异步任务
- 在celery_tasks/main.py主入口
#Celery的入口
from celery import Celery
# 把celery和django进行组合,必须让celery能识别和加载django的配置文件以及django的类库
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo.settings.dev')
# 对django框架执行初始化
import django
django.setup()
#创建Celery实例 生产者
celery_app = Celery('meiduo')
#加载配置
celery_app.config_from_object('celery_tasks.config')
# 注册任务
celery_app.autodiscover_tasks(['celery_tasks.email']) #有多个任务可写多个
- 在celery_tasks/config.py配置文件中
# Celery配置文件
# 指定中间人、消息队列、任务队列、容器,使用redis
broker_url = "redis://192.168.204.128/10"
# 结果队列的链接地址
celery_result_backend = 'redis://127.0.0.1:6379/14'
- 在celery_tasks/email/tasks.py
from django.core.mail import send_mail
from django.conf import settings
from celery_tasks.main import celery_app
@celery_app.task(name='send_verify_email', base=Mytask) #name 起别名 #base的值为监听的那个类
def send_verify_email(to_email,verify_url):
"""定义发送邮件的任务"""
# send_mail('标题','普通邮件的正文','发件人','收件人列表','富文本邮件正文')
subject = '填主题'
#message = '普通文本'
#html_message是发送带html样式信息
html_message = '<p>尊敬的用户您好!</p>' \
'<p>感谢您使用xxxx。</p>' \
'<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \
'<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)
send_mail(subject,'',settings.EMAIL_FROM,[to_email],html_message=html_message)
celery异步执行任务不全都是成功的,所以我们需要监听任务
- 在celery_tasks/email/tasks.py 加上下面的代码
from celery.task import Task
# 监听整个任务的钩子
class Mytask(Task):
def on_success(self, retval, task_id, args, kwargs):
print('task success 11111')
return super(Mytask, self).on_success(retval, task_id, args, kwargs)
def on_failure(self, exc, task_id, args, kwargs, einfo):
print('task failed')
# 可以记录到程序中或者任务队列中,让celery尝试重新执行
return super(Mytask, self).on_failure(exc, task_id, args, kwargs, einfo)
def after_return(self, status, retval, task_id, args, kwargs, einfo):
print('this is after return')
return super(Mytask, self).after_return(status, retval, task_id, args, kwargs, einfo)
def on_retry(self, exc, task_id, args, kwargs, einfo):
print('this is retry')
return super(Mytask,self).on_retry(exc, task_id, args, kwargs, einfo)
- 在django视图views文件中调用
#创建日志输出器
logger = logging.getLogger('django')
class EmailView(LoginRequiredJSONMixin,View):
"""添加邮箱"""
def put(self,request):
#接收参数
json_str = request.body.decode()
json_dict = json.loads(json_str)
email = json_dict.get('email')
#校验参数
if not email:
return HttpResponseForbidden('缺少email参数')
if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
return HttpResponseForbidden('参数email有误')
# 将用户传入的邮箱保存到用户数据库的email字段中
try:
request.user.email = email
request.user.save()
except Exception as e:
logger.error(e)
return JsonResponse({'code':RETCODE.DBERR,'errmsg':'添加邮箱失败'})
#发送邮箱验证邮件 这里是调用邮件的
verify_url = 'www.baidu.com'
send_verify_email.delay(email,verify_url) #一定要加delay!!!!
return JsonResponse({'code':RETCODE.OK,'errmsg':'OK'})
- 启动
终端输入命令启动celery:celery -A celery_tasks.main worker -l info -P eventlet
- 发送邮件
网页中点击你发送邮件的那个按钮,测试,看后台输出
- 遇到的问题
1.仔细看send_mail(subject,'',settings.EMAIL_FROM,[to_email],html_message=html_message)这边的传参位置,原码中send_mail接收的参数html_message在最后一个,如果你这边调用的时候,不是关键字传参的话,发送出去的短信对方接收到将不会展现文本内容!
2.启动celery后可能会报错,这边可以看我博客另外一篇讲celery启动后发送邮件报错的解决办法。目前照上面我的代码调用的话,是可以正常成功的接发收邮件的。
3.视图中调用邮件函数的时候,一定记得要加delay!一定!一定!一定!
django中使用celery异步发送邮件的更多相关文章
- celery介绍、架构、快速使用、包结构,celery执行异步、延迟、定时任务,django中使用celery,定时更新首页轮播图效果实现,数据加入redis缓存的坑及解决
今日内容概要 celery介绍,架构 celery 快速使用 celery包结构 celery执行异步任务 celery执行延迟任务 celery执行定时任务 django中使用celery 定时更新 ...
- celery异步发送邮件
利用Django框架发送邮件的详细过程,在前两天的博客中有所记录,但是单纯的那样发邮件是有非常大的问题的,这就需要celery异步发送来解决 首先我们来看一下邮件发送的过程: Django网站先发送到 ...
- Django 中使用 Celery
起步 在 <分布式任务队列Celery使用说明> 中介绍了在 Python 中使用 Celery 来实验异步任务和定时任务功能.本文介绍如何在 Django 中使用 Celery. 安装 ...
- Python—在Django中使用Celery
一.Django中的请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下: http请求发起 经过中间件 http handling(request解析) ur ...
- Django中使用Celery实现定时任务(用djcelery)
一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...
- Django中使用Celery
一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...
- Django之使用celery异步完成发送验证码
使用celery的目的:将项目中耗时的操作放入一个新的进程实现 1.安装celery pip install celery 2.在项目的文件夹下创建包celery_tasks用于保存celery异步任 ...
- Celery简介以及Django中使用celery
目录 Celery简介 消息中间件 任务执行单元 任务结果存储 使用场景 Celery的安装和配置 Celery执行异步任务 基本使用 延时任务 定时任务 异步处理Django任务 案例: Celer ...
- django中使用celery,模拟商品秒杀。
Celery是Python开发的简单.灵活可靠的.处理大量消息的分布式任务调度模块 安装: pip install celery # 安装celery库 pip install redis # cel ...
- 四、Django中使用celery
项目跟目录创建celery包,目录结构如下: mycelery/ ├── config.py ├── __init__.py ├── main.py └── sms/ ├── __init__.py ...
随机推荐
- [转帖]Python基础之判断和循环(三)
https://www.jianshu.com/p/5a7552821c63 一.判断 关于判断,跟字面意思一样,就是判断某一个时刻应不应该做某件事: 语法: if 判断条件: 执行语句-- else ...
- STM32CubeMX教程24 WDG - 独立窗口看门狗
1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...
- mysql系列基础篇03----约束
一.概述 1.概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据 2.目的:保证数据库中数据的正确,有效性和完整性. 3.分类 二.约束演示 创建一个用户表 create table my ...
- 微服务用yml安装系统(第一版)
当用微服务安装系统后,面临服务较多,一个一个安装比较麻烦,是否有统一的脚本可以直接执行安装呢?答案是肯定的: 1.首先介绍一下所有安装脚本,如下图 spd-volume:是各服务外挂的资料卷 comm ...
- Leetcode 42题 接雨水(Trapping Rain Water) Java语言求解
题目链接 https://leetcode-cn.com/problems/trapping-rain-water/ 题目内容 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱 ...
- Leetcode 面试题22. 链表中倒数第k个节点 Java语言求解
题目链接 https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/ 题目内容 输入一个链表,输出该链 ...
- 微信小程序-页面跳转navigator组件
官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/app-service/route.html 在官方文档当中有提到一 ...
- 深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab系列简介、DeepLabV3深入解读创新点、训练策略、主要贡献
深度学习应用篇-计算机视觉-语义分割综述[6]:DeepLab系列简介.DeepLabV3深入解读创新点.训练策略.主要贡献 0.DeepLabV3深入解读 1.DeepLab系列简介 1.1.Dee ...
- Python 实现SynFlood洪水攻击
Syn-Flood攻击属于TCP攻击,Flood类攻击中最常见,危害最大的是Syn-Flood攻击,也是历史最悠久的攻击之一,该攻击属于半开放攻击,攻击实现原理就是通过发送大量半连接状态的数据包,从而 ...
- Python 检测PE所启用保护方式
Python 通过pywin32模块调用WindowsAPI接口,实现对特定进程加载模块的枚举输出并检测该PE程序模块所启用的保护方式,此处枚举输出的是当前正在运行进程所加载模块的DLL模块信息,需要 ...