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连接oracle数据库实例
Oct 17 Python
Python3中类、模块、错误与异常、文件的简易教程
Nov 20 Python
Python实现多进程共享数据的方法分析
Dec 04 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
python异常处理和日志处理方式
Dec 24 Python
使用python实现希尔、计数、基数基础排序的代码
Dec 25 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
通过python连接Linux命令行代码实例
Feb 18 Python
python利用opencv保存、播放视频
Nov 02 Python
Python爬虫如何破解JS加密的Cookie
Nov 19 Python
Python操作PostgreSql数据库的方法(基本的增删改查)
Dec 29 Python
Python爬取某平台短视频的方法
Feb 08 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
PHP Smarty生成EXCEL文档的代码
2008/08/23 PHP
php 中文和编码判断代码
2010/05/16 PHP
Git命令之分支详解
2021/03/02 PHP
jquery 问答知识整理
2010/02/11 Javascript
仿新浪微博登陆邮箱提示效果的js代码
2013/08/02 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
兼容主流浏览器的JS复制内容到剪贴板
2014/12/12 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
Vue中computed与methods的区别详解
2018/03/24 Javascript
深入学习JavaScript中的bom
2019/05/27 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
2020/07/15 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
Python制作简易注册登录系统
2016/12/15 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
在python中利用KNN实现对iris进行分类的方法
2018/12/11 Python
Python3 读取Word文件方式
2020/02/13 Python
在python3中实现更新界面
2020/02/21 Python
python实现用户名密码校验
2020/03/18 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
Hello Molly美国:女性时尚在线
2019/08/26 全球购物
物流管理专业求职信
2014/05/29 职场文书
道德与公民自我评价
2015/03/09 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
大学生实习证明
2015/06/16 职场文书
新学期主题班会
2015/08/17 职场文书
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫