Django之使用内置函数和celery发邮件的方法示例


Posted in Python onSeptember 16, 2019

邮箱配置

开启stmp服务

以163邮箱为例,点击设置里面的stmp

Django之使用内置函数和celery发邮件的方法示例

开启客户端授权密码

Django之使用内置函数和celery发邮件的方法示例

如上所示,因为我已经开启了,所以出现的是以上页面。

这样,邮箱的准备就已经完成了。

使用Django内置函数发邮件

1.在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 = '绿色果园<发送邮件的邮箱>'

2.编写发送邮件代码

from django.shortcuts import render, redirect, HttpResponse
from django.core.mail import send_mail
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings

def emailtest(request):
  # 发送激活邮件,包括激活链接:http://127.0.0.1:8000/user/active/3
  # 激活链接中需要包含用户的身份信息,并且要把身份信息进行加密
  # 加密用户的身份信息,生成激活token
  userid = 3
  email = "接收邮件的邮箱账号"
  serializer = Serializer(settings.SECRET_KEY, 1800)
  info = {'confirm': userid}
  token = serializer.dumps(info)
  token = token.decode()
  # 发邮件
  subject = "绿色果园欢迎信息"
  message = ""
  sender = settings.EMAIL_FROM
  receiver = [email]
  html_message = "<h2>欢迎你成为绿色果园注册会员</h2></br>请点击以下链接激活账号<a href='http:127.0.0.1:8000/" \
          "user/active/%s'>http:127.0.0.1:8000/user/active/%s</a>" % (token, token)
  send_mail(subject, message, sender, receiver, html_message=html_message)

  # 返回应答,跳转到首页
  return HttpResponse("邮件发送成功,请注意接收")

配套url

urlpatterns = [
  url(r'^emailtest/$', views.emailtest, name="emailtest"), # 发邮件测试
]

3.在浏览器中输入如下地址,即可看到“邮件已发送”的提示信息

http://127.0.0.1:8000/user/emailtest/

接收邮件如下图所示

收到邮件

Django之使用内置函数和celery发邮件的方法示例

邮件内容详情

Django之使用内置函数和celery发邮件的方法示例

使用celery发邮件

使用django内置的函数发送邮件时,django给stmp服务器发送邮件需要时间,stmp服务器发送邮件给用户也需要时间,而在发送邮件这段时间内,用户是在等服务端返回应答的,如果等待时间过长,那么无疑会大大的降低用户的体验。

这个时候,我们可以使用celery来异步发送邮件,即Django服务端在celery发送邮件的同时,返回应答给用户。这里,我们使用sleep来模拟发送邮件的时常。

1.安装celery

pip install celery

2.配置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 = '绿色果园<发送邮件的邮箱>'

# diango的缓存配置
CACHES = {
  "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    "LOCATION": "redis://127.0.0.1:6379/9",
    "OPTIONS": {
      "CLIENT_CLASS": "django_redis.client.DefaultClient",
    }
  }
}

3.在项目下新建celery_tasks文件夹,在文件夹中新建tasks文件, 编写tasks文件

from django.core.mail import send_mail
from django.conf import settings
from celery import Celery
import time

# 在任务处理者一端时需要加这几句
# import os
# import django
# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
# django.setup()

# 创建一个Celery类的实例对象
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/8')


# 定义任务函数
@app.task
def send_register_active_email(to_email, username, token):
  """发送激活邮件"""
  subject = "绿色果园欢迎信息"
  message = ""
  sender = settings.EMAIL_FROM
  receiver = [to_email]
  html_message = "<h2>%s, 欢迎你成为绿色果园注册会员</h2></br>请点击以下链接激活账号<a href='http:127.0.0.1:8000/" \
          "user/active/%s'>http:127.0.0.1:8000/user/active/%s</a>" % (username, token, token)
  send_mail(subject, message, sender, receiver, html_message=html_message)
  time.sleep(5)

4.在发送邮件的地方 调用 celery_tasks下的tasks下的 发送邮件函数

from django.shortcuts import render, redirect, HttpResponse
from django.core.mail import send_mail
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings

def emailtest(request):
  # 发送激活邮件,包括激活链接:http://127.0.0.1:8000/user/active/3
  # 激活链接中需要包含用户的身份信息,并且要把身份信息进行加密
  # 加密用户的身份信息,生成激活token
  userid = 3
  username = "mumun"
  email = "收邮件的邮箱"
  serializer = Serializer(settings.SECRET_KEY, 1800)
  info = {'confirm': userid}
  token = serializer.dumps(info)
  token = token.decode()
  # 使用celery发送邮件
  send_register_active_email.delay(email, username, token)

  # 返回应答,跳转到首页
  return HttpResponse("邮件发送成功,请注意接收")

配套url

urlpatterns = [
  url(r'^emailtest/$', views.emailtest, name="emailtest"), # 发邮件测试
]

5.开启redis服务;

E:\>cd E:\YifChanSoft\Database\Redis\RedisSoft\Redis-x64-3.2.100

E:\YifChanSoft\Database\Redis\RedisSoft\Redis-x64-3.2.100>redis-server --service-install redis.windows-service.conf --loglevel verbose

E:\YifChanSoft\Database\Redis\RedisSoft\Redis-x64-3.2.100>redis-cli
127.0.0.1:6379> select 8
OK
127.0.0.1:6379[8]> keys *
(empty list or set)
127.0.0.1:6379[8]> keys *
1) "_kombu.binding.celery"
2) "_kombu.binding.celery.pidbox"
3) "_kombu.binding.celeryev"

开启redis服务截图

Django之使用内置函数和celery发邮件的方法示例

6.将项目代码拷贝一份放在某处,进入该处, 启动tasks的worker模式

注意,用作worker的代码的tasks文件中应该有提前启动django的初始化的代码,不然worker没法调用conf信息;

即应该有以下内容

# 在任务处理者一端时需要加这几句
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")
django.setup()

开启worker模式:

celery -A celery_tasks.tasks worker -l info

出现问题,报错如下

ValueError: not enough values to unpack (expected 3, got 0)

原因

win10上运行celery4.x就会出现这个问题

解决

pip install eventlet

并在开启worker模式时加入参数

celery -A celery_tasks.tasks worker -l info -P eventlet

开启worker模式截图,后面还有内容,但因为太多了,就只截一半

Django之使用内置函数和celery发邮件的方法示例

7.在浏览器中输入如下地址,即可看到“邮件已发送”的提示信息

http://127.0.0.1:8000/user/emailtest/

接收邮件如下

Django之使用内置函数和celery发邮件的方法示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
python在控制台输出进度条的方法
Jun 20 Python
python实现决策树分类(2)
Aug 30 Python
python 删除字符串中连续多个空格并保留一个的方法
Dec 22 Python
简单了解Python生成器是什么
Jul 02 Python
python numpy中cumsum的用法详解
Oct 17 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
Django通过dwebsocket实现websocket的例子
Nov 15 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
Python多线程获取返回值代码实例
Feb 17 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
Jun 03 Python
django中使用事务及接入支付宝支付功能
Sep 15 #Python
Django中的FBV和CBV用法详解
Sep 15 #Python
Python爬虫实现使用beautifulSoup4爬取名言网功能案例
Sep 15 #Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
Sep 15 #Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 #Python
Python数据库小程序源代码
Sep 15 #Python
python中树与树的表示知识点总结
Sep 14 #Python
You might like
php google或baidu分页代码
2009/11/26 PHP
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
Express使用html模板的详细代码
2017/09/18 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
百度小程序自定义通用toast组件
2019/07/17 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
Python3 合并二叉树的实现
2019/09/30 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
大学生饮食配送创业计划书
2014/01/04 职场文书
食品安全宣传标语
2014/06/07 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
租赁协议书
2015/01/27 职场文书
实习生个人总结范文
2015/02/28 职场文书
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL