保存邮箱并发送验证邮件

Posted hzlnice

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保存邮箱并发送验证邮件相关的知识,希望对你有一定的参考价值。

后端接口设计:

请求方式:PUT /email/

请求参数: JSON 或 表单

参数类型是否必须说明
email str Email邮箱

返回数据: JSON

返回值类型是否必须说明
id int 用户id
email str Email邮箱

在users/serializers.py中新建序列化器,用户验证用户提交的邮箱信息。

class EmailSerializer(serializers.ModelSerializer):
    """
    邮箱序列化器
    """
    class Meta:
        model = User
        fields = (‘id‘, ‘email‘)
        extra_kwargs = {
            ‘email‘: {
                ‘required‘: True
            }
        }

    def update(self, instance, validated_data):
        instance.email = validated_data[‘email‘]
        instance.save()
        return instance

在users/views.py中创建新视图,用于保存用户的邮箱信息,注意需要用户登录通过认证后。

from rest_framework.permissions import IsAuthenticated

class EmailView(UpdateAPIView):
    """
    保存用户邮箱
    """
    permission_classes = [IsAuthenticated]
    serializer_class = serializers.EmailSerializer

    def get_object(self, *args, **kwargs):
        return self.request.user

设置路由信息

 url(r‘^emails/$‘, views.EmailView.as_view()),  # 设置邮箱

补充发送验证邮件

在保存邮箱的时候,需要向用户发送验证邮件,我们将发送邮件的工作放到celery中异步执行。

在celerytasks目录中新建email目录和`email/_init.py文件和email/tasks.py`文件

email/tasks.py文件中是实现发送邮件的异步任务

from celery_tasks.main import celery_app
from django.core.mail import send_mail
from django.conf import settings


@celery_app.task(name=‘send_verify_email‘)
def send_verify_email(to_email, verify_url):
    """
    发送验证邮箱邮件
    :param to_email: 收件人邮箱
    :param verify_url: 验证链接
    :return: None
    """
    subject = "美多商城邮箱验证"
    html_message = ‘<p>尊敬的用户您好!</p>‘                    ‘<p>感谢您使用美多商城。</p>‘                    ‘<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>‘                    ‘<p><a href="%s">%s<a></p>‘ % (to_email, verify_url, verify_url)
    send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)
注意

在发送邮件的异步任务中,需要用到django的配置文件,所以我们需要修改celery的启动文件main.py,在其中指明celery可以读取的django配置文件,并且注册添加email的任务

from celery import Celery

# 为celery使用django配置文件进行设置
import os
if not os.getenv(‘DJANGO_SETTINGS_MODULE‘):
    os.environ[‘DJANGO_SETTINGS_MODULE‘] = ‘meiduo_mall.settings.dev‘

# 创建celery应用
celery_app = Celery(‘meiduo‘)

# 导入celery配置
celery_app.config_from_object(‘celery_tasks.config‘)

# 自动注册celery任务
celery_app.autodiscover_tasks([‘celery_tasks.sms‘, ‘celery_tasks.email‘])
在User模型类中定义生成验证邮箱链接的方法

邮箱的激活链接是用户点击时会访问的网址,我们让用户点击时进入到success_verify_email.html页面。

    def generate_verify_email_url(self):
        """
        生成验证邮箱的url
        """
        serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)
        data = {‘user_id‘: self.id, ‘email‘: self.email}
        token = serializer.dumps(data).decode()
        verify_url = ‘http://www.meiduo.site:8080/success_verify_email.html?token=‘ + token
        return verify_url
修改EmailSerializer序列化器的update方法,增加发送邮件
    def update(self, instance, validated_data):
        email = validated_data[‘email‘]
        instance.email = email
        instance.save()

        # 生成验证链接
        verify_url = instance.generate_verify_email_url()
        # 发送验证邮件
        send_verify_email.delay(email, verify_url)
        return instance

以上是关于保存邮箱并发送验证邮件的主要内容,如果未能解决你的问题,请参考以下文章

servlet邮箱激活验证实例含代码

官网发邮箱激活能不能拦截邮件信息

qq邮箱为啥邮件发送失败重新发送验证码

java实现邮件发送验证码

java案例----用户注册--发送邮件并激活/发送邮件验证码

[技术博客] 使用邮箱验证并激活账户