在用django开发项目时,会用到注册账号发送邮箱来激活账号或接收手机验证码。
本篇博客写发送邮箱验证码,后续写发送手机验证码。
首先可以配置邮箱的一些必须的参数等
如,张三来注册 x 网站,邮箱是[email protected],那么这个邮箱会收到激活链接,那么给他发送链接的邮箱是什么,需要我们 自己配置,在全局的settings.py中
EMAIL_HOST = 'smtp.163.com' # 163邮箱的 SMTP 地址
EMAIL_PORT = 25 # SMTP端口
EMAIL_HOST_USER = '[email protected]' # 我自己的邮箱
EMAIL_HOST_PASSWORD = '****************' # 我的邮箱授权码
EMAIL_SUBJECT_PREFIX = '[huamuxiong]' # 为邮件Subject-line前缀,默认是'[django]'
EMAIL_USE_TLS = False # 与SMTP服务器通信时,是否启动TLS链接(安全链接)。默认是false
EMAIL_FROM = '[email protected]' # 与 EMAIL_HOST_USER 相同
# 邮箱--用来激活账号和找回密码
class EmailPro(models.Model):
code = models.CharField(max_length=20, verbose_name='验证码')
email = models.EmailField(max_length=50, verbose_name='邮箱')
send_type = models.CharField(max_length=10, choices=(('register', '邮箱注册'), ('forget', '忘记密码')), verbose_name='发送类型')
send_time = models.DateTimeField(auto_now_add=True, verbose_name='发送时间')
class Meta:
db_table='emailpro'
verbose_name='邮箱验证码'
verbose_name_plural=verbose_name
生成随机验证码的函数:
randomlength:生成多少位的字符串,默认是 8 位
from random import Random
# 随机生成字符串
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 # 将拼接的字符串返回
写发送邮箱的函数:
from django.core.mail import send_mail
from index.models import EmailPro
from rentingHouse.settings import EMAIL_FROM # 项目名称为 rentingHouse
# 接收两个参数,一个邮箱,另一个是发送类型,注册或忘记密码
def send_register_email(email, send_type='register'): # 类型为注册
email_recode = EmailPro()
code = random_str(16) # 生成16位的随机字符串
email_recode.code = code
email_recode.email = email
email_recode.send_type = send_type
email_recode.save()
email_title = ''
email_body = ''
if send_type == 'register':
email_title = '注册激活链接'
email_body = '请点击下方的链接激活你的账号:http://127.0.0.1:8000/active/{0}'.format(code)
else:
pass # 忘记密码--暂时不写
send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) # 注释 ①
if send_status:
pass
注释 ①:
看一下必传的四个参数:
subject: 主题,也就是 标题 title
message:消息,也就是 内容 body
from_email:发送的邮箱 配置中的 EMAIL_FROM
recipient_list:收件人清单,要求是列表 ,[email1, email2,…],只有一个的话也是列表[email]
send_mail会返回一个结果,可对结果做简单的处理,这里不写
def send_mail(subject, message, from_email, recipient_list,
fail_silently=False, auth_user=None, auth_password=None,
connection=None, html_message=None):
在注册时,让 isActice 设置为False,即不激活
... # 验证邮箱是否存在,两次密码是否一致等,直接简写了
email = request.POST.get('email', '')
password = request.POST.get('password', '')
password = make_password(password) # 密码加密
# 将注册信息添加到数据库的user表中
obj = User(email=email, username=username, password=password, isActive=False)
obj.save()
send_register_email(email, 'register') # 调用发送邮件的方法
注册页面,使用[email protected]
邮箱注册
登陆protonmail
邮箱查看一下
显示的是一个主题 title 和 发送者邮箱
点进去看一下
由于未搭建服务器, 所以暂时还是本地地址 127.0.0.1
在登陆时根据isActive
是否为True来判断账号是否被激活,上述说到False为没激活
False —> 0
if user.isActive == 0:
return render(request, 'login.html', {'error_msg': '账号尚未激活'})
说明:这里我暂时用的用户名username
,可以设置成邮箱,或这个两者都可以登陆的那种(借助Q),这里不说了
那么在邮箱里点击链接后,需要做的就是让isActive=True
class ActiveUserView(View):
def get(self, request, active_code):
all_codes = EmailPro.objects.filter(code=active_code)
if all_codes:
for recode in all_codes:
email = recode.email
user = User.objects.get(email=email)
user.isActive=True
user.save()
return redirect('/login/')
else:
return render(request, 'code_fail.html')
用到的url
url('^active/(?P.*)/$' , ActiveUserView.as_view(), name='active_code'), # 注册激活链接
至此本篇文章结束