前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Django 发送注册激活邮箱

Django 发送注册激活邮箱

作者头像
菜菜cc
发布2022-11-15 21:17:23
发布2022-11-15 21:17:23
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

本文讲解网站开发中常见的注册模块中邮箱激活功能。

发送邮件

Django中内置了邮件发送功能,发送邮件需要SMTP服务器支持,本文采用第三方QQ邮箱的SMTP服务器来配置。

1.登陆QQ邮箱,进入设置

2.进入账户,开启SMTP服务

开启POP3/SMTP服务

再开启IMAP/SMTP服务

3.获取授权码

复制上图的授权码(打码部分)待后面配置用。

4.配置

打开项目的settings.py,在最后面加入以下配置内容

代码语言:javascript
代码运行次数:0
运行
复制
# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
# 发送邮件的邮箱 (需要修改成你的QQ邮箱)
EMAIL_HOST_USER = '123456789@qq.com'
# 在邮箱中获取的16位授权密码 (需要修改成刚刚获取的授权码)
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxxxxxxx'
# 收件人看到的发件人 (需要修改成你的QQ邮箱)
EMAIL_FROM = '超级商城<123456789@qq.com>'

5.发送邮件

Django使用send_mail来发送邮件,需要导入send_mail函数from django.core.mail import send_mail

代码语言:javascript
代码运行次数:0
运行
复制
from django.core.mail import send_mail

class RegisterView(View):
    """
    用户注册视图
    """
    def post(self, request):

        # 其他代码
        # ...

        # 主题
        subject = '超级商城欢迎注册'
        # message表示发送的纯文本,
        # 如果需要发送带样式的,则使用html_message
        # 用html_message时,message为空字符串
        message = ''
        # 收件人列表
        receiver = [email]
        # 需要发送的带样式内容
        html_message = '<h1>欢迎注册超级商城账号</h1>' \
                       '请点击下面链接激活您的账号<br>'
        # 发送者
        sender = settings.EMAIL_FROM
        # 发送邮件
        send_mail(subject, message, sender, receiver, html_message=html_message)
        return HttpResponse('OK')

这样就成功实现了发送邮件功能,当用户进行注册时,提交表单时就会送到邮件。

补充(itsdangerous库)

上面讲解中其实并没有在邮件内容中加入激活链接。一般利用用户id来组成URL放在邮件中让用户来激活,但是考虑到直接使用id会存在安全问题,用户可能会恶意进行访问注册,所以一般会将其加密来组成URL。这里介绍的是itsdangerous库。在处理激活视图中获取URL中加密的id,进行解密后便可在数据库中给指定的用户激活字段设置为True。

安装itsdangerous库

代码语言:javascript
代码运行次数:0
运行
复制
pip install itsdangerous

加密用户信息

代码语言:javascript
代码运行次数:0
运行
复制
from django.shortcuts import render, HttpResponse
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
from django.conf import settings

    class RegisterView(View):
    """
    用户注册视图
    """
        def post(self, request):

            # 其他代码
            # ...

            # 加密用户信息
            #################################################################
            # 第一个参数是加盐,这里使用的是配置文件里Django框架自动生成的字符串
            # 第二个参数是过期时间,以秒为单位,这里设置的是1小时
            serializer = Serializer(settings.SECRET_KEY, 3600)
            info = {'confirm': user.id}
            # 加密。指定utf8编码
            token = serializer.dumps(info).decode()
            #################################################################

            # 主题
            subject = '超级商城欢迎注册'
            # message表示发送的纯文本,
            # 如果需要发送带样式的,则使用html_message
            # 用html_message时,message为空字符串
            message = ''
            # 收件人列表
            receiver = [email]
            # 需要发送的带样式内容
            html_message = '<h1>%s,欢迎注册超级商城账号</h1>' \
                           '请点击下面链接激活您的账号<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)
            # 发送者
            sender = settings.EMAIL_FROM
            # 发送邮件
            send_mail(subject, message, sender, receiver, html_message=html_message)
            return HttpResponse('OK')

解密用户信息

代码语言:javascript
代码运行次数:0
运行
复制
from django.shortcuts import render, HttpResponse
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
from django.conf import settings

class ActiveView(View):
    """
    用户激活视图
    """
    def get(self, request, token):
        # 解密用户信息
        # 加密时如何实例化,解密就如何实例化
        serializer = Serializer(settings.SECRET_KEY, 3600)
        try:
            # 解密。加密前是什么类型的数据,解密后也是什么类型数据
            info = serializer.loads(token)
            id = info['confirm']
            user = User.objects.get(id=id)
            user.is_active = True
            user.save()
            return HttpResponse('OK')

        # 过期后会触发SignatureExpired异常
        except SignatureExpired:
            return HttpResponse('激活链接已过期')

本文作者: Ifan Tsai  (菜菜)

本文链接: https://cloud.tencent.com/developer/article/2164578

版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 发送邮件
    • 1.登陆QQ邮箱,进入设置
    • 2.进入账户,开启SMTP服务
    • 3.获取授权码
    • 4.配置
    • 5.发送邮件
  • 补充(itsdangerous库)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档