上一篇文章链接Django05
我们知道python中smtplib模块用于邮件的功能,而django对这个这模块进行封装,使得它使用起来十分简单。
django.core.mail就是django邮件的核心模块。
众所周知,我们一般注册一个账号,会受到一封激活邮件,下面就把注册模块与邮件发送模块合并起来展示
1.打开邮箱的SMTP服务(以QQ邮箱为例):
打开QQ邮箱,找到设置里的账户下面的:
POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
开启任意一个具有SMTP的服务,保存好生成的授权码
2.django配置:
在项目同名文件夹下的setting里面配置:
# #邮箱验证配置
# EMAIL_BACKED =
# EMAIL_USE_TLS =
# EMAIL_HOST =
# EMAIL_PORT =
# EMAIL_HOST_PASSWORD =
# DEFAULT_FROM_EMAIL =
# 邮箱验证配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = False
EMAIL_HOST = 'smtp.qq.com'
# 端口
EMAIL_PORT = 25
# 发送邮箱
EMAIL_HOST_USER = 'xxx@qq.com' #xxx是你自己准备好的邮箱
# 授权码
EMAIL_HOST_PASSWORD = 'kmgvfycnodisbeai' #这个需要你之前保存的授权码
DEFAULT_FROM_EMAIL = '花生二手车<xxx@qq.com>'
#xxx是你自己准备好的邮箱
#这样别人收到的邮件中就会有你设定的名称'花生二手车'
3.注册模块与邮件发送模块:
'''注册模块'''
class RegisterView(View):
def get(self,request):
return render(request, 'index.html')
def post(self,request):
objs = request.POST
# <QueryDict: {'username': ['www1111111111'], 'email': ['121@qq.com'], 'password': ['12345678'], 'cpassword': ['12345678'], 'sex': ['1']}>
username = objs['username']
password = objs['password']
cpassword = objs['cpassword']
email = objs['email']
sex = objs['sex']
#进行用户名,密码,邮箱的格式校验
if not re.match(r'^\w{8,16}$', username):
return HttpResponse('username is error')
elif not password:
return HttpResponse('password is error')
elif not cpassword == password:
return HttpResponse('cpassword is error')
elif not re.match(r'^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$', email):
return HttpResponse('email is error')
elif not sex:
return HttpResponse('sex is error')
# 判断用户名是否已经存在
try:
user_mysql = UserInfo.objects.get(username=username)
except:
user_mysql = None
if user_mysql:
return HttpResponse('用户名重复')
# 判断邮箱是否重复
try:
print('进入邮箱')
email_mysql = UserInfo.objects.filter(email__exact=email)
except:
email_mysql = None
if email_mysql:
return HttpResponse('邮箱重复')
# 创建一个对象,填充细节
user = UserInfo.objects.create_user(username=username, email=email, password=password) # create_user(self, username, email=None, password=None,
user.is_active = 0 # 设置成未激活
user.save() # 保存对象进入数据库
# 设置激活链接,并对关键信息进行加密操作
# 设置秘钥
SECRET_KEY = 'ff0u=h&)nbrwxnc%54n*#d%*32&bx+@5y#hgeex^6=o@9i)vz&' #此项目随机生成的秘钥
t = tr(SECRET_KEY,3600) # def __init__(self, secret_key, expires_in=None, **kwargs):
user_id_dict = {'user_id':user.id} #定义一个字典,设定激活码user_id 为此用户的id
active_id = t.dumps(user_id_dict) #加密编码,生成字节类型
#dumps():将obj对象序列化并返回一个bytes对象(某一个数据类型转成bytes)
active_id = active_id.decode() #解码:把字节类型转义为可以识别的字符
# dumps(self, obj, salt=None, header_fields=None)
subject = '花生二手车交易平台' # 定义邮件标题
message = '' # 定义邮件内容
html_message = '<div><a href="http://127.0.0.1:8000/user/active/%s">这是激活邮件</a></div>' % active_id
#定义具有HTML功能的邮件内容
from_email = 'xxx@qq.com' # 发送的邮箱
recipient_list = [to_email] # 接收的多个邮箱,每个成员都recipient_list将在电子邮件的“收件人:”字段中看到其他收件人。
#time.sleep(10)
send_mail(subject=subject, message=message, html_message=html_message, from_email=from_email,recipient_list=recipient_list)
#发送邮件
return render(request,'index.html')
4.邮箱激活模块:
'''邮箱激活'''
class ActiveHandler(View):
def get(self,request,obj):
#设置秘钥
SECRET_KEY = 'ff0u=h&)nbrwxnc%54n*#d%*32&bx+@5y#hgeex^6=o@9i)vz&'
t = tr(SECRET_KEY,3600) #初始化对象
try:
user_id_dict = t.loads(obj) #解码:解除和秘钥的混合编码
#loads():将bytes反序列化并返回一个对象(bytes转成之前的数据类型)-----就是先转为bytes,然后返回反序列化数据
userid = user_id_dict['user_id'] #取出字典的user_id 对应的值
user = UserInfo.objects.get(id=userid) #从数据库提出指定对象
user.is_active = 1 #激活
user.save() #保存
return HttpResponse('激活成功')
except Exception as e:
return HttpResponse('激活失败')