python之Django的入门06------send mail邮件发送功能

上一篇文章链接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 = '[email protected]'   #xxx是你自己准备好的邮箱
					# 授权码
					EMAIL_HOST_PASSWORD = 'kmgvfycnodisbeai'   #这个需要你之前保存的授权码
					DEFAULT_FROM_EMAIL = '花生二手车<[email protected]>'
					#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': ['[email protected]'], '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 = '[email protected]'  # 发送的邮箱
	    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('激活失败')

猜你喜欢

转载自blog.csdn.net/sui_yi123/article/details/82968563