自己的项目中有绑定邮箱需求通常需要了解两个点:一是要知道发送邮件的方法,二是得知道邮件的激活机制
以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 = '邮件测试'
步骤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='hello')
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 = '尊敬的用户您好!
' \
'您的邮箱为:%s 。请点击此链接激活您的邮箱:
' \
'' % (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'})