0、验证流程
1、网易邮箱获取相关参数
- 获取授权码
- 往下滚动,获取参数信息
2、配置Django工程的配置文件
后面构建异步任务的时候需要导过去使用
# 发送短信的相关设置, 这些设置是当用户没有发送相关字段时, 默认使用的内容:
# 发送短信必须进行的设置:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# 我们使用的 smtp服务器 地址
EMAIL_HOST = 'smtp.163.com'
# 端口号
EMAIL_PORT = 25
# 下面的内容是可变的, 随后台设置的不同而改变:
# 发送邮件的邮箱
EMAIL_HOST_USER = '13317640978@163.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'AGQRHROEBNPEXEYB'
# 收件人看到的发件人
EMAIL_FROM = 'user_san<13317640978@163.com>'
# 邮箱验证链接(根据业务需求定)
EMAIL_VERIFY_URL = 'http://www.meiduo.site:8080/success_verify_email.html?token='
3、封装验证的url
加密方法SecretOauth().dumps()
详见之前的文章:点我跳转
def generate_verify_email_url(request):
"""
功能:生成验证的url
:param request: 请求对象
:return: 返回验证url
"""
user = request.user
token = SecretOauth().dumps({
'user_id': user.id,
'username': user.username,
'email': user.email
})
verify_url = settings.EMAIL_VERIFY_URL + token
return verify_url
4、构建发送邮件的异步任务
异步任务实现,详看之前文章:点我跳转
代码:
from celery_tasks.main import celery_app
from django.conf import settings
from django.core.mail import send_mail
@celery_app.task(name='send_verify_email')
def send_verify_email(email, verify_url):
"""
功能:发送邮件
:param to_email: 目标邮箱
:param verify_url: 验证url
:return: 1成,0失败
"""
html_message = '<p>尊敬的用户您好!</p>' \
'<p>感谢您使用本商城。</p>' \
'<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \
'<p><a href="%s">%s<a></p>' % (email, verify_url, verify_url)
# 调用Django自带的发送邮件函数
return send_mail(
subject='这是一封验证身份的邮件', # 邮件主题
message='',
from_email=settings.EMAIL_FROM, # 收件人看到的发件人
recipient_list=[email], # 需要验证的邮箱号
html_message=html_message
)
5、异步任务执行文件,添加发送邮件这一任务
注意点
:
(1)之前文章我们实现异步发送短信验证码的时候,不需要用到配置文件的参数,因此不需要指定配置文件。
(2)但是这里需要用到发送邮件的服务器相关参数,所以需要将配置文件的参数设置为环境变量异步函数在执行的时候才能被异步程序识别到。
(3)如果不设置环境变量,会发生这样的错误:点我跳转
6、最终的新增邮箱并验证接口
代码:
# 新增用户邮箱
class EmialView(View, LoginRequiredJSONMixin):
def put(self, request):
data = json.loads(request.body.decode())
email = data.get('email')
user = request.user
if not email:
return JsonResponse({
'code': 400,
'errmsg': '缺少参数'
}, status=400)
if not re.match(r'^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$', email):
return JsonResponse({
'code': 400,
'errmsg': '邮箱格式有误'
})
try:
user.email = email
user.email_active = False
user.save()
except Exception as e:
print(e)
return JsonResponse({
'code': 400,
'errmsg': '修改邮箱。写入失败'
})
# TODO:新建邮箱成功,发送验证邮件
#获取验证url
verify_url = generate_verify_email_url(request)
# 发送邮件任务(函数),使用异步方式调用
send_verify_email.delay(email, verify_url)
return JsonResponse({
'cdoe': 0,
'errmsg': 'OK'
})
在异步任务执行文件main.py
的上级目录,启动异步任务:
celery -A celery_tasks.main worker -l info
当用户在前端界面发送验证邮箱之后,用户会收到类似下面的邮件
点击验证的链接,会再一次发送请求给Django后端服务器,请求中会携带着之前加密的token,后端进行解密后,提取用户信息、邮箱号等等,和校验数据库的数据进行校验,校验成功则返回响应给前端,表示验证完毕(成功)。