发送邮件来让用户激活,因此,邮件中需要包含用户信息。但用户信息需要加密才可以。因此加密采用的是itsdangerous中的TimedJSONWebSignatureSerializer。

参考链接:https://juejin.im/entry/56b30250df0eea0054375e1d

用法和JSON WEB 签名中的用法一样。

加密:

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 创建对象, 第一个参数加密密钥,可以随便写,但解密也需要相同的,
# 过期事件,秒为单位
serializer = Serializer(settings.SECRET_KEY, 3600)
# 要加密的数据
info = {'confirm':zengsf}
# 进行加密,token为加密结果,bytes数据
token = serializer.dumps(info)
# 转换为utf8格式
token = token.decode()

解密:

# 创建一个对象
serializer = Serializer(settings.SECRET_KEY, 3600)
# 将str装换为byte
token.encode()
# 参数是加密之后的结果,返回是解密之后的结果
info = serializer.loads(token)
# 获取值
result = info['confirm']

如果过期的话,会有一个SignatureExpired的签名过期异常。

我们利用邮箱大部分都是163,qq, 126这些邮箱,这些都是免费的,都是smtp模式。

到django中settings.py中进行配置:

# 发送邮箱配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smtp服务地址
EMAIL_HOST = 'smtp.163.com'
# 端口号
EMAIL_PORT = 25
# 发送邮件的邮箱
EMAIL_HOST_USER = 'zengsf***@163.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'zengsf***'
# 收件人看到的发件人
EMAIL_FROM = '<zengsf***@163.com>'

然后回到视图中,具体用法:https://yiyibooks.cn/xx/django_182/topics/email.html

from django.core.mail import send_mail
msg='<a href="http://www.127.0.0.1:8000/subject/pythonzly/index.shtml" target="_blank">点击激活</a>'
send_mail('注册激活','',settings.EMAIL_FROM,
['zengsf***@163.com'],
html_message=msg)

这样就实现了在django中发送邮件消息。但有一个问题就是,send_mail是一个阻塞函数,因此给客户带来长时间等待,体验感不好。然后可以使用celery来解决这个问题。主要就是分三种,发送者,中间人,处理者。

发送者:就是要处理的事件。

中间人:SQLAlchemy、Django ORM、Memcached、 Redis、RPC (RabbitMQ/AMQP)都可以当中间人。

处理者:就是监听中间人,并处理事件。

这里使用redis当中间人。

发送者:-----------------------------------------------

创建一个tasks.py

from celery import Celery
from django.conf import settings
from django.core.mail import send_mail # 创建一个Celery类的实例对象
app = Celery('demo',broker='redis://:127.0.0.1:6379/1') # 创建任务函数
@app.task
def my_task():
msg='<a href="http://www.127.0.0.1:8000/subject/pythonzly/index.shtml" target="_blank">点击激活</a>'
send_mail('注册激活','',settings.EMAIL_FROM,['zengsf***@163.com'],html_message=msg)

接着来到发邮件的views中。

from celery_tasks.tasks import my_task

# 发送任务, 就会把任务发送到redis中的任务队列中
my_task.delay()

到这里,发送者和中间人就ok了。

处理者:---------------------------------

如果发送者,中间人,处理者在不同的电脑中,但一定要在同一网段中,要确定互相通信。

启动处理者的前提是你的中间人也要开启。由于环境不再一起,因此,处理者那边也要有一份和发送者这边一样的代码。

启动处理者:celery -A celery_tasks.tasks worker -l info

如果这样直接去发邮件话,还会报错,serder = settings.EMAIL_FROM这个错误,这是因为,tasks.py中需要用到django中的配置文件,但由于这里没有启动django项目,因此就报错了。解决方法就是在启动处理者的时候,初始化django里面的配置文件

然后在tasks.py中添加一些初始化功能:

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

这样就可以了。

django中向用户发送邮件信息的更多相关文章

  1. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

  2. django中添加用户

    在django中添加用户,直接在auth_user表中添加会有问题,因为这里密码是加密的,可以通过manage.py shell加入 创建User: 1 >>> from djang ...

  3. 基于SqlSugar的开发框架循序渐进介绍(6)-- 在基类接口中注入用户身份信息接口

    在基于SqlSugar的开发框架中,我们设计了一些系统服务层的基类,在基类中会有很多涉及到相关的数据处理操作的,如果需要跟踪具体是那个用户进行操作的,那么就需要获得当前用户的身份信息,包括在Web A ...

  4. Django 中的用户认证

    Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的 会话.本文说明这个系统是如何工作的. 概览 认证系统由以下部分组成: 用户 权限:控制用户进否可以执行某项任 ...

  5. 微信小程序之登录连接django,以及用户的信息授权认证

    小结: 1 如何自定义组件 - 组件和页面一样,也是由四个文件组成,所以我们自定义组件的时候,模拟pages文件夹,把所有的所有的组件都放在一个文件夹中,每个组件又由一个文件夹包裹,方便管理,在对应目 ...

  6. Django 中自定义用户模型及集成认证授权功能总结

    1. 概述 Django 中的 django.contrib.auth 应用提供了完整的用户及认证授权功能. Django 官方推荐基于内置 User 数据模型创建新的自定义用户模型,方便添加 bir ...

  7. SAP中关于用户IP信息的获取(转载)

    SAP中如何获取登录用户的IP? 或如何查看哪些IP登录到SAP中: 在Table: USR41中查看,具体字段的说明如下: MANDT   ---   ClientBNAME   ---   登录的 ...

  8. Oracle 中记录用户登录信息

    我们可以使用 Oracle Audit 函数来记录用户登录信息,但是如果开放了 Audit 函数将会使 Oracle 性能下降,甚至导致 Oracle 崩溃.那我们如何才能记录用户登录信息呢?其实我们 ...

  9. ORACLE 存储过程中保存用户自定义异常信息的一种方式

    1.创建错误日志表: create table REP_LOGS ( log_s_no NUMBER not null, log_date DATE default sysdate not null, ...

随机推荐

  1. CentOS 6.5优化开机启动服务

    使用chkconfig命令列举出所有服务,配合管道筛选出开机默认启动的服务,再去掉level0(关机).level4(无意义)和level6(重启)的显示,使结果更直观. chkconfig | gr ...

  2. springboot shiro和freemarker集成之权限控制完全参考手册(跳过认证,登录由三方验证,全网首发)

    本文主要考虑单点登录场景,登录由其他系统负责,业务子系统只使用shiro进行菜单和功能权限校验,登录信息通过token从redis取得,这样登录验证和授权就相互解耦了. 用户.角色.权限进行集中式管理 ...

  3. 面向对象的封装(私有化)及@property(查看)/@setter(修改)!!!

    面向对象有三大特性,继承,多态,封装继承可以减少代码重复量,多态可以用多继承模仿别的语言的建立规则约束子类封装为类的属性/方法的私有化,可以限制别人看,读,修改的权限,目前理解做记录,日后温习,回顾, ...

  4. MVC校验方式【六】

    一.以往的校验都是自己写正则表达式校验,本篇讲的是通过MVC自带的jquery文件进行校验 实现步骤:1. 在webform页面中引入两个jquery文件,10,11行的代码. <%@ Page ...

  5. servelet基础

    1.1           servlet简介 Java Servlet 是运行在 Web 服务器或应用服务器上的程序.她是一个浏览器和服务器之间的中间层.程序员开发程序,实现servlet的接口.S ...

  6. Asp.net core (学习笔记 路由和语言 route & language)

    https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...

  7. 英语发音规则---I字母常见发音组合有哪些

    英语发音规则---I字母常见发音组合有哪些 一.总结 一句话总结: I/y在开音节中发/aɪ/,例如:bite /baɪt/ n. 咬 I/y在闭音节中发 /ɪ/,例如:clinic /'klɪnɪk ...

  8. [JavaScript-Function] Function Invocation/Call(函数调用) 以及call() and apply() 方法

    介绍:JS函数中的代码会被函数被invoke(调用)时执行. 函数被定义时代码不执行, 函数调用时函数内的代码会被执行. 常用的term是 call a function 而不是 invoke a f ...

  9. HTML辅助方法

    顾名思义,HTML辅助方法(HTML Helper)就是用来辅助产生HTML之用,在开发View的时候一定会面对许多HTML标签,处理这些HTML的工作非常繁琐,为了降低View的复杂度,可以使用HT ...

  10. recon工具解读

    recon 是ferd 大神 释出的一个 用于生产环境诊断Erlang 问题的一个工具, 不仅仅是对Erlang stdlib 接口的封装, 还有memory fragmentation 相关的函数. ...