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 相关文章推荐
Python实现获取操作系统版本信息方法
Apr 08 Python
Python爬虫利用cookie实现模拟登陆实例详解
Jan 12 Python
python实现简单点对点(p2p)聊天
Sep 13 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
PyQt5每天必学之弹出消息框
Apr 19 Python
python之从文件读取数据到list的实例讲解
Apr 19 Python
Python操作MySQL数据库的方法
Jun 20 Python
深入浅析Python中的迭代器
Jun 04 Python
Python Django 实现简单注册功能过程详解
Jul 29 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
Feb 20 Python
使用python向MongoDB插入时间字段的操作
May 18 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以及MYSQL日期比较方法
2012/11/29 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
js实现进度条的方法
2015/02/13 Javascript
JavaScript实现级联菜单的方法
2015/06/29 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
js实现带三角符的手风琴效果
2017/03/01 Javascript
基于js中style.width与offsetWidth的区别(详解)
2017/11/12 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
javascript使用正则表达式实现注册登入校验
2020/09/23 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
Python语言快速上手学习方法
2018/12/14 Python
python如何实现数据的线性拟合
2019/07/19 Python
Python读取YAML文件过程详解
2019/12/30 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
金讯Java笔试题目
2013/06/18 面试题
Shell如何接收变量输入
2012/09/24 面试题
冰淇淋店的创业计划书
2014/02/07 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
文明礼貌主题班会
2015/08/14 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Android Rxjava3 使用场景详解
2022/04/07 Java/Android