Django 发送注册激活邮箱

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

发送邮件

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

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

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

开启POP3/SMTP服务

再开启IMAP/SMTP服务

3.获取授权码

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

4.配置

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

# 发送邮件配置
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

from django.core.mail import send_mail

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

        # 其他代码
        # ...

        # 主题
        subject = '超级商城欢迎注册'
        # message表示发送的纯文本,
        # 如果需要发送带样式的,则使用html_message
        # 用html_message时,message为空字符串
        message = ''
        # 收件人列表
        receiver = 
        # 需要发送的带样式内容
        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库

pip install itsdangerous

加密用户信息

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 = 
            # 需要发送的带样式内容
            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')

解密用户信息

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://www.caiyifan.cn/p/e06b99aa.html
版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!

未经允许不得转载:木盒主机 » Django 发送注册激活邮箱

赞 (0)

相关推荐

    暂无内容!