djiango-异步发送邮件--celery
安装
pip install celery==4.2.0 # celery4.x支持django1.11以上版本 试了好几个版本 就4.2.0能发送成功
1.项目目录里新建一个celery的包celery_tasks

tasks.py中
from django.conf import settings
from django.core.mail import send_mail from celery import Celery # 导入celery包# 创建一个Celery类的实例对象
# Celery(名称(一般写包名), 中间人broke)
app = Celery('celery_tasks.tasks', broker='redis://192.168.199.130:6379/2') # 2 使用第二个数据库 # 定义任务函数
@app.task # 装饰 必不可少
def send_register_active_email(to_email, username, token):
# '''发送激活邮件'''
# 组织邮件信息
# 发送邮件
subject = '天天生鲜欢迎信息' # 邮件主题
# 邮件正文
# 注:此处html标签是不会被解析出来 会当作字符串输出
# message = '<h1>%s, 欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的账户:<br/><a href="http://192.168.199.130:8000/user/active/%s">http://192.168.199.130:8000/user/active/%s</a>' % (username, token, token)
message = ''
sender = settings.EMAIL_FROM # 发件人
receiver = [to_email] # 收件人列表
html_message = '<h1>%s, 欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的账户<br/><a href="http://192.168.199.130:8000/user/active/%s">http://192.168.199.130:8000/user/active/%s</a>' % (
username, token, token)
print(html_message)
# send_mail(邮件主题, 邮件正文, 发件人, 收件人列表, html_message=HTML格式的内容)
# send_mail(subject, message, sender, receiver)
send_mail(subject, message, sender, receiver, html_message=html_message)
2.在视图函数中导入tasks包就行
from celery_tasks.tasks import send_register_active_email # 导入celery发邮件的方法 # 发送邮件
# delay(收件人, 用户名, token)
send_register_active_email.delay(email, username, token) # 把任务放入队列
3.启动redis
执行celery命令
celery -A celery_tasks.tasks worker -l info
报错
python@ubuntu:~/bj19/ttsx/dailyfresh$ celery -A celery_tasks.tasks worker -l info
Traceback (most recent call last):
File "/usr/local/bin/celery", line 11, in <module>
sys.exit(main())
File "/usr/local/lib/python3.5/dist-packages/celery/__main__.py", line 16, in main
_main()
File "/usr/local/lib/python3.5/dist-packages/celery/bin/celery.py", line 322, in main
cmd.execute_from_commandline(argv)
File "/usr/local/lib/python3.5/dist-packages/celery/bin/celery.py", line 496, in execute_from_commandline
super(CeleryCommand, self).execute_from_commandline(argv)))
File "/usr/local/lib/python3.5/dist-packages/celery/bin/base.py", line 298, in execute_from_commandline
return self.handle_argv(self.prog_name, argv[1:])
File "/usr/local/lib/python3.5/dist-packages/celery/bin/celery.py", line 488, in handle_argv
return self.execute(command, argv)
File "/usr/local/lib/python3.5/dist-packages/celery/bin/celery.py", line 420, in execute
).run_from_argv(self.prog_name, argv[1:], command=argv[0])
File "/usr/local/lib/python3.5/dist-packages/celery/bin/worker.py", line 223, in run_from_argv
return self(*args, **options)
File "/usr/local/lib/python3.5/dist-packages/celery/bin/base.py", line 252, in __call__
ret = self.run(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/celery/bin/worker.py", line 257, in run
**kwargs)
File "/usr/local/lib/python3.5/dist-packages/celery/worker/worker.py", line 101, in __init__
self.setup_instance(**self.prepare_args(**kwargs))
File "/usr/local/lib/python3.5/dist-packages/celery/worker/worker.py", line 124, in setup_instance
self.should_use_eventloop() if use_eventloop is None
File "/usr/local/lib/python3.5/dist-packages/celery/worker/worker.py", line 243, in should_use_eventloop
self._conninfo.transport.implements.asynchronous and
File "/usr/local/lib/python3.5/dist-packages/kombu/connection.py", line 871, in transport
self._transport = self.create_transport()
File "/usr/local/lib/python3.5/dist-packages/kombu/connection.py", line 598, in create_transport
return self.get_transport_cls()(client=self)
File "/usr/local/lib/python3.5/dist-packages/kombu/transport/redis.py", line 1039, in __init__
raise ImportError('Missing redis library (pip install redis)')
ImportError: Missing redis library (pip install redis)
这是因为pip没装redis
安装redis组件
pip install -U "celery[redis]"
再次敲命令就可以了
发送邮件时继续报错
[2019-09-25 17:41:28,074: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[58be8ac2-4deb-4ca1-809b-6a88e9a2fc9f]
[2019-09-25 17:41:28,085: ERROR/ForkPoolWorker-2] Task celery_tasks.tasks.send_register_active_email[58be8ac2-4deb-4ca1-809b-6a88e9a2fc9f] raised unexpected: ImproperlyConfigured('Requested setting EMAIL_FROM, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.',)
Traceback (most recent call last):
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/celery/app/trace.py", line 382, in trace_task
R = retval = fun(*args, **kwargs)
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/celery/app/trace.py", line 641, in __protected_call__
return self.run(*args, **kwargs)
File "/home/python/bj19/ttsx/dailyfresh/celery_tasks/tasks.py", line 24, in send_register_active_email
sender = settings.EMAIL_FROM # 发件人
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/django/conf/__init__.py", line 48, in __getattr__
self._setup(name)
File "/home/python/.virtualenvs/bj19/lib/python3.5/site-packages/django/conf/__init__.py", line 42, in _setup
% (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_FROM, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
django没有初始化导致的
在tasks.py文件中初始化
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings") # 从wsgi.py中复制过来
django.setup()
再次测试,发送成功
djiango-异步发送邮件--celery的更多相关文章
- celery异步发送邮件
利用Django框架发送邮件的详细过程,在前两天的博客中有所记录,但是单纯的那样发邮件是有非常大的问题的,这就需要celery异步发送来解决 首先我们来看一下邮件发送的过程: Django网站先发送到 ...
- C# 利用SMTP异步发送邮件
C#实现收发邮件功能需要用到两个命名空间 System.Net; 和 System.Net.Mail; SmtpClient client = new SmtpClient("smtp.g ...
- flask 异步发送邮件
异步发送邮件 当使用SMTP的方式发送电子邮件时,如果你手动使用浏览器测试程序的注册功能,在提交注册表单后,浏览器会有几秒钟的不响应.因为这时候程序正在发送电子邮件,发信的操作阻断了请求--响应循环, ...
- [django]python异步神器-celery
python异步神器celery https://segmentfault.com/a/1190000007780963
- Spring的JavaMail实现异步发送邮件
具体背景就不说了,可以网上搜索相关知识,或者直接看Sping MailSender的官坊网页.这里就直接实战了(Java实现异步发送电子邮件,包含中文无乱码). Maven: <dependen ...
- spring boot 异步发送邮件
发送邮件由于是一个耗时的操作,有可能需要一个几十秒的操作,但是呢,接口 是一个瞬间完成的,为了不影响接口的性能,所以需要对发送邮件的操作进行异步操作,我们这里呢,首先我们要引入发送邮件的测试模块. & ...
- (三)集成 JavaMail ,实现异步发送邮件
集成 JavaMail ,实现异步发送邮件 1.JavaMail的核心API 1.1 API功能图解 1.2 API说明 1.2.1 Message 类: 1.2.2 Transport 类 1.2. ...
- 异步任务--celery发送邮件
安装两个python包: pip install celery==3.1.25 pip install django-celery==3.1.17 在配置文件settings.py中做如下配置: a) ...
- 使用django + celery + redis 异步发送邮件
参考:http://blog.csdn.net/Ricky110/article/details/77205291 环境: centos7 + python3.6.1 + django2.0.1 ...
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
随机推荐
- PHP对二维数组进行排序
/** * 获取最近的店铺 * @param $lng * @param $lat * @return array */ protected function getClosestShop($lng, ...
- GitBook的使用
首先安装gitbook npm install -g gitbook-cli 检查是否安装成功 gitbook -V 然后就要建立一个文件夹进到文件夹目录下 让此文件夹初始化下 gitbook ini ...
- mysql 导入sql大文件
引自:https://dba.stackexchange.com/questions/83125/mysql-any-way-to-import-a-huge-32-gb-sql-dump-faste ...
- [loj 6253] Yazid的新生舞会
(很久之前刷的题现在看起来十分陌生a) 题意: 给你一个长度为n的序列A,定义一个区间$[l,r]$是“新生舞会的”当且仅当该区间的众数次数严格大于$\frac{r-l+1}{2}$,求有多少子区间是 ...
- AWS--Lamdba
分享一个Lambda相关的连接 https://blog.csdn.net/m0_37204491/article/details/72829477
- 《区块链DAPP开发入门、代码实现、场景应用》笔记1——天外飞仙DAPP
Solidity编程语言解决了编写智能合约的不友好的问题,但是当合约编译并部署之后,对与这些接口的访问,对于一般的使用者来说,门槛有点高, 对普通用户来说也是非常不友好,为了使广大用户理解并方便快捷的 ...
- GO执行shell命令
Golang执行shell命令主要依靠exec模块 代码为核心逻辑,并非全部 运行命令 cmd1 = exec.Command("ls") if err = cmd1.Run(); ...
- 技术圈术语之LDAP
导语:阅读一些程序的文档时经常看到支持ldap,由于对这个协议不太熟悉,平时也没有用过,所以一直也没怎么留意,今天看rabbitmq的文档又发现了ldap相关的介绍,于是想把这个问题搞清楚. 一.LD ...
- Hybris订单价格的折扣维护
backoffice里创建一个新订单,维护一个行项目,添加一个产品: 在行项目的SubTotal界面,维护Base Price,在Discount values字段里,输入折扣信息:discount: ...
- 使用HTMLTestRunner模块生成测试报告
步骤: 1.下载HTMLTestRunner模块 HTMLTestRunnerCN.py是中文版本的,EN是英文版本的,将要使用的版本放到Python安装目录下lib文件夹中,然后试试看能不能impo ...