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实现在无须过多援引的情况下创建字典的方法
Sep 25 Python
Python 数据结构之堆栈实例代码
Jan 22 Python
Pycharm学习教程(1) 定制外观
May 02 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
如何使用Python脚本实现文件拷贝
Nov 20 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
基于python实现获取网页图片过程解析
May 11 Python
Python同时处理多个异常的方法
Jul 28 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
Python中的min及返回最小值索引的操作
May 10 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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的memory_limit限制的方法分享
2012/02/21 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php将远程图片保存到本地服务器的实现代码
2015/08/03 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
最短的IE判断代码
2011/03/13 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
js中作用域的实例解析
2017/03/16 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
vue实现计算器功能
2020/02/22 Javascript
py2exe 编译ico图标的代码
2013/03/08 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
int在python中的含义以及用法
2019/06/27 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
css3实现超炫风车特效
2014/11/12 HTML / CSS
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
合伙协议书
2014/04/23 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
2016年优秀团员事迹材料
2016/02/25 职场文书
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers