django中向用户发送邮件信息

发送邮件来让用户激活,因此,邮件中需要包含用户信息。但用户信息需要加密才可以。因此加密采用的是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()

这样就可以了。

 

转载于:https://www.cnblogs.com/zengsf/p/10082052.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django REST framework 中实现邮件批量发送,可以使用 Django 自带的邮件发送功能和 DRF 的 Serializer 来完成。 首先,在 Django 项目中配置邮件发送功能,具体步骤如下: 1. 在 settings.py 文件中添加以下配置: ``` EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 使用 SMTP 后端 EMAIL_HOST = 'smtp.example.com' # SMTP 服务器地址 EMAIL_PORT = 587 # SMTP 服务器端口号 EMAIL_USE_TLS = True # 是否使用 TLS 安全协议 EMAIL_HOST_USER = 'your_email@example.com' # 发送邮件的邮箱地址 EMAIL_HOST_PASSWORD = 'your_email_password' # 发送邮件的邮箱密码 ``` 2. 在 Django 项目中编写发送邮件的代码,例如下面的代码实现了邮件批量发送的功能: ```python from django.core.mail import send_mail from django.shortcuts import get_object_or_404 from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from .models import User from .serializers import UserSerializer class EmailUsersView(APIView): def post(self, request): serializer = UserSerializer(data=request.data, many=True) if serializer.is_valid(): recipients = [] for user_data in serializer.validated_data: user = get_object_or_404(User, email=user_data['email']) recipients.append(user.email) subject = '邮件主题' message = '邮件内容' from_email = '发件人邮箱' send_mail(subject, message, from_email, recipients) return Response(serializer.validated_data, status=status.HTTP_200_OK) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) ``` 在上面的代码中,我们首先使用 UserSerializer 对请求的数据进行反序列化,并验证数据的有效性。然后,我们遍历验证后的数据,获取每个用户的邮箱地址,并将其添加到收件人列表中。最后,我们使用 Django 自带的 send_mail 函数发送邮件。 最后,在 urls.py 文件中定义 URL 路由,将请求映射到 EmailUsersView 类中: ```python from django.urls import path from .views import EmailUsersView urlpatterns = [ path('email_users/', EmailUsersView.as_view(), name='email_users'), ] ``` 这样就完成了在 Django REST framework 中实现邮件批量发送的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值