一、电子邮件系统原理
参考:https://blog.csdn.net/qq_15646957/article/details/52544099
二、发送邮件
1、先注册邮箱,这里注册的是新浪邮箱。登陆之后,点击设置,点击开启服务状态
2、settings中邮箱配置
3、新建utils包(python package),编写发送邮件逻辑块email_send.py
# _*_ coding:utf-8 _*_
__author__ = "yf"
__date__ = "2018/7/8 10:44"
from random import Random
from django.core.mail import send_mail
from MxOnline1.settings import EMAIL_FROM
from users.models import EmailVerifyRecord
# 生成随机字符串
def random_str(randomlength=8):
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars) - 1
random = Random()
for i in range(randomlength):
str += chars[random.randint(0, length)]
return str
def send_register_email(email, send_type="register"):
# 发送邮件之前将用户发的信息保存在数据库中
email_record = EmailVerifyRecord()
code = random_str(16)
email_record.code = code
email_record.email = email
email_record.send_type = send_type
email_record.save()
# 发送邮件初始状态下为空
email_title = ""
email_body = ""
if send_type == "register":
email_title = "慕学在线网注册激活链接"
email_body = "请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code)
# 发送邮件
send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
if send_status:
pass
4、编写views.py,完善RegisterView
class RegisterView(View):
def get(self, request):
register_form = RegisterForm(request.POST)
return render(request, 'register.html', {"register_form": register_form})
def post(self, request):
register_form = RegisterForm(request.POST)
if register_form.is_valid():
user_name = request.POST.get("email", "") # 取出前端传过来的username
if UserProfile.objects.filter(email=user_name): # 判断用户是否已经存在
return render(request, "register.html", {"msg": "用户已经存在!", "register_form": register_form })
pass_word = request.POST.get("password", "") # 取出前端传过来的password
user_profile = UserProfile() # 实例化UserProfile类
user_profile.username = user_name # 将用户赋给实例user_profile的username和email
user_profile.email = user_name
user_profile.password = make_password(pass_word) # 将密码加密,赋给password,密文形式保存到数据库
user_profile.is_active = False # 用户在点击激活链接之前是未激活的
user_profile.save() # 将用户、密码保存到数据库
send_register_email(user_name, "register")
return render(request, 'login.html')
else:
return render(request, 'register.html', {'register_form': register_form})
5、测试
在合适的地方打断点,单步调试
邮件成功发送
6、错误信息显示
和login.html页面错误显示类似
数据在views.py中传入前端,可在模板中直接用
不输入邮箱、密码、验证码时错误显示
输入邮箱、密码,不输入验证码时错误显示和数据回填功能
三、用户激活功能
1、用户在点击激活链接之前是未激活的
设置点击链接,链接的url和随机生成的code相关,利用code生成相对应的邮箱激活链接
点击链接之后跳转到另一个页面
测试
在注册页面进行注册,收到发送的邮件,点击激活链接,进入激活页面
后端调试可以看到active_code和链接的随机生成的code是一样的,这样邮箱激活链接完成了
完善激活逻辑,点击激活连接之后,激活用户,并新建激活失败页面
注册激活后,会跳转到登录页面,直接登录即可
2、用户登录时也需要判断用户是否激活
错误信息传给模板
测试
总结:用户在登录时三个判断
表单数据有效性判断
登录用户信息与数据库比较
登陆的用户是否激活