如何进行邮箱验证

自己的项目中有绑定邮箱需求通常需要了解两个点:一是要知道发送邮件的方法,二是得知道邮件的激活机制
以django框架中邮箱验证为例

1:绑定邮箱和发送邮件,首先得给自己定义好的表里的email字段添加一个有效的邮箱,然后使用SMTP服务器给此邮箱发送邮件

django发送邮件的方法:Django中内置了邮件发送功能,被定义在django.core.mail模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:163、126、QQ,下面以163邮件为例
步骤1):注册一个邮箱,在邮箱管理界面设置一下,使其成为服务器,拿到自己设置的授权密码
步骤2):在Django配置文件中,设置邮箱的配置信息

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
#发送邮件的邮箱
EMAIL_HOST_USER = '[email protected]'
#客户端授权密码
EMAIL_HOST_PASSWORD = 'demo123'
#收件人看到的发件人信息
EMAIL_FROM = '邮件测试<[email protected]>'

步骤3):使用Django提供的模块发送邮件
在django.core.mail模块提供了send_mail来发送邮件。

send_mail(subject, message, from_email, recipient_list,html_message=None)
# 例如
send_mail('注册测试','',settings.EMAIL_FROM, ['[email protected]'], html_message='<a>hello</a>')
  • subject 邮件标题
  • message 普通邮件正文, 普通字符串
  • from_email 发件人
  • recipient_list 收件人列表
  • html_message 多媒体邮件正文,可以是html字符串
    步骤4):保存邮箱,发送邮件。写一个接口,用于修改用户email字段值,可设置认证用户然后改写get_object
    序列化器:
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

视图:

from rest_framework.generics import UpdateAPIView
from .serializers import EmailSerializer

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

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

最后配置路由
2:验证邮箱,为了能区分是哪个用户在进行邮箱验证,需要在链接中包含用户和邮箱的识别信息,如user_id和email数据,但是基于安全性的考虑,不能将这两个数据直接暴露在邮件链接中,而是需要进行隐藏和签名处理,这是可使用itsdangerous包中的dumps和loads方法来进行加密和解密。
步骤1):生成发送验证的url

from itsdangerous import TimedJSONWebSignatureSerializer as TJWSSerializer
class User(models.Model)
	    serializer = TJWSSerializer(SECRET_KEY, expires_in=EXPIRES_TIME)
        data = {'user_id': self.id, 'email': self.email}
        token = serializer.dumps(data).decode()  # 加密后是bytes类型,要转为字符串
        verify_url = 'http://demo:8080/success_verify_email.html?token=' + token
        return verify_url

拿到url后拼接html_message

html_message =  '<p>尊敬的用户您好!</p>' \
                '<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \
                '<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)
    

然后调用自带的send_mail方法,想当前用户发送邮件

send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)

步骤2):用户在自己收到的邮件中点击链接,服务器接收请求,验证token
在users/models.py中,为User模型类定义验证token的方法

from itsdangerous import BadData

    @staticmethod
    def check_verify_email_token(token):
        """
        检查验证邮件的token
        """
        serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)
        try:
            data = serializer.loads(token)
        except BadData:
            return None
        else:
            email = data.get('email')
            user_id = data.get('user_id')
            try:
                user = User.objects.get(id=user_id, email=email)
            except User.DoesNotExist:
                return None
            else:
                return user

新建视图对序列化器和模型类进行处理

class VerifyEmailView(APIView):
    """
    邮箱验证
    """
    def get(self, request):
        # 获取token
        token = request.query_params.get('token')
        if not token:
            return Response({'message': '缺少token'}, status=status.HTTP_400_BAD_REQUEST)

        # 验证token
        user = User.check_verify_email_token(token)
        if user is None:
            return Response({'message': '链接信息无效'}, status=status.HTTP_400_BAD_REQUEST)
        else:
            user.email_active = True
            user.save()
            return Response({'message': 'OK'})

猜你喜欢

转载自blog.csdn.net/Best_fish/article/details/83514567