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实现图像几何变换
Jul 06 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
Apr 11 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
Python嵌套列表转一维的方法(压平嵌套列表)
Jul 03 Python
Python logging模块用法示例
Aug 28 Python
python 对key为时间的dict排序方法
Oct 17 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
Django 内置权限扩展案例详解
Mar 04 Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 Python
python命令 -u参数用法解析
Oct 24 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
Python unittest单元测试openpyxl实现过程解析
May 27 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
Terran热键控制
2020/03/14 星际争霸
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
1亿条数据如何分表100张到Mysql数据库中(PHP)
2015/07/29 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
微信小程序获取用户信息的两种方法wx.getUserInfo与open-data实例分析
2019/05/03 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
python持久性管理pickle模块详细介绍
2015/02/18 Python
Python+django实现简单的文件上传
2016/08/17 Python
Python多线程实现同步的四种方式
2017/05/02 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
详解django.contirb.auth-认证
2018/07/16 Python
python http基本验证方法
2018/12/26 Python
python提取xml里面的链接源码详解
2019/10/15 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
2020/06/18 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
初中地理教学反思
2014/01/11 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
你为什么是穷人?可能是这5个缺点造成
2019/07/11 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang