邮箱配置
# 在 settings 下配置邮件发送
# 配置邮件发送
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com' # 如果为163邮箱,设置为smtp.163.com
EMAIL_PORT = 25 # 或者 465/587是设置了 SSL 加密方式
# 发送邮件的邮箱
EMAIL_HOST_USER = '自己邮箱'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = '邮箱设置-->账户-->开启服务 如图' # 第三方登陆使用的授权密码
EMAIL_USE_TLS = True # 这里必须是 True,否则发送不成功
# 收件人看到的发件人, 必须是一直且有效的
EMAIL_FROM = '脑瓜疼<自己邮箱>'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
在 views 中导包
# 如果没有 itsdangerous 包
pip install itsdangerous
# 发送邮箱配置
from django.conf import settings
# 邮箱注册
from django.core.mail import send_mail
# 加密
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 过期异常处理
from itsdangerous import SignatureExpired
# 配置密钥 失效时间
serializer=Serializer(settings.SECRET_KEY,180)
注册
class Register(APIView):
def post(self,request):
name=request.data.get('username')
word=request.data.get('password')
word1=request.data.get('password1')
email=request.data.get('email')
if not re.match(r'[0-9a-zA-Z]{0,19}@(.*?).com',email):
return Response({'msg':'邮箱错误','code':400})
user=User.objects.filter(username=name).first()
if user:
return Response({'msg':'用户已存在','code':400})
if word==word1:
data={'username':name,'password':make_password(word),'email':email}
user_serializer=UserModelSerializer(data=data)
if user_serializer.is_valid():
user_serializer.save()
# 数据保存以后,可以进行发邮件
user_obj=user_serializer.data
# 把用户信息制作成字典
user_info={'user_id':user_obj.get('id')}
# 用户信息序列化加密
token=serializer.dumps(user_info).decode()
# 标题
subject='好又多会员注册'
# 消息
message='欢迎注册好又多商城会员'
# 和 settings中的 EMAIL_FROM 匹配
from_email=settings.EMAIL_FROM
# 那个邮箱接收这个消息
recipient_list=[email]
html_message='<h3>欢迎注册好又多商城会员,请点击以下链接进行激活:</br><a href="http://127.0.0.1:8000/app01/register/?token={}">激活用户点这里</a></h3>'.format(token)
send_mail(subject=subject,
message=message,
recipient_list=recipient_list,
from_email=from_email,
html_message=html_message)
return Response({'msg':'注册成功','code':200})
else:
return Response({'msg':'注册失败','code':400})
else:
return Response({'msg':'两次密码不一致','code':400})
解密
def get(self,request):
print(request.GET.get('token'))
token=request.GET.get('token')
try:
# 序列化解密 token值
user_info=serializer.loads(token)
print(user_info)
return Response({'msg': 'OK', 'code': 200, 'token':user_info})
except SignatureExpired:
return Response({'msg':'激活失败','code':200})