urls.py代码如下:
from .views import forget_pass
urlpatterns = [
# 忘记密码
path('forget_pass', forget_pass, name='forget_pass'),
]
views.py代码如下:
def forget_pass(request):
if request.method == "POST":
user = request.POST['user']
get_email = request.POST['email']
username = User.objects.filter(username=user)
# 输入的账号不存在时,报错
if not username:
return render(request, 'forget_pass.html', {'user_error': '您输入的账号不存在.'})
# 输入账号存在时,做如下检查
else:
# 检查输入的邮箱与现存的邮箱是否匹配.username因为是QuerySet类型,所以要加[0].
if get_email != username[0].email:
return render(request, 'forget_pass.html', {'email_error': '您输入的邮箱不对,请检查.'})
# 如果输入的账号与邮箱匹配,则重置密码,并发送邮件.
else:
import random
from .utils import Email
# 产生随机8位密码
random_password = ""
for x in range(8):
random_num = str(random.randint(0, 9))
random_low_alpha = chr(random.randint(97, 122))
random_upper_alpha = chr(random.randint(65, 90))
random_char = random.choice([random_num, random_low_alpha, random_upper_alpha])
random_password += random_char
# 重置密码
username[0].set_password(random_password)
username[0].save()
# 发送重置密码邮件
content_plain = "您好,您收到这封邮件,是因为你选择了忘记密码,重置了密码,新的密码为: %s" % random_password
email = Email(
smtp_server='smtp.163.com',
from_addr='XXXXX@163.com',
password='XXXXXXX',
to_addr=get_email,
type='plain',
title='重置密码',
content=content_plain
)
flag = email.send_msg()
# 邮件发送成功标记
if flag == 1:
return render(request, 'forget_pass.html', {'success': "重置密码已发邮件"})
# 邮件发送失败反馈
else:
return render(request, 'forget_pass.html', {'send_email_failed': flag})
# 如果request是GET,则返回如下
else:
return render(request, 'forget_pass.html')
utls.py用于发送邮件的代码:
class Email(object):
"""
# smtp服务器以及相关配置信息
smtp_server = 'smtp.163.com'
from_addr = 'XXXX@163.com'
password = 'XXXXXX' # 网易授权码,非邮箱登入密码.
to_addr = 'XXXX@XXXX.cn' # 接收邮箱
type = 'html' 发送html格式(html格式发送邮件,比较容易被当做垃圾邮件处理)的邮件内容,还可以选择为"plain",纯文本格式
title = '使用smtp库发送' # 邮件标题
content = ''' # html格式的邮件内容
<html>
<body>
<h1>附件是相关的IPv6材料</h1>
<p>地址:<a href="https://blog.csdn.net/linqunbin">Bruce的博客</a>
</p>
</body>
</html>
'''
"""
def __init__(self, smtp_server, from_addr, password, to_addr, type, title, content):
self.smtp_server = smtp_server
self.from_addr = from_addr
self.password = password
self.to_addr = to_addr
self.type = type
self.title = title
self.content = content
# 1 创建邮箱(写好邮件内容 发送人 收件人和标题等)
def msg(self):
from email.mime.text import MIMEText
from email.utils import formataddr
# 发送html邮件
# msg = MIMEText(self.content, 'plain', 'utf-8') # 其中plain表示纯文本内容
msg = MIMEText(self.content, 'html', 'utf-8')
# 发件人昵称和邮箱,可以写成 formataddr(('林群彬', from_addr))
msg['From'] = formataddr((self.from_addr, self.from_addr))
# 收件人昵称和邮箱,可以写成 formataddr(('Bruce Lin', from_addr))
msg['To'] = formataddr((self.to_addr, self.to_addr))
msg['Subject'] = self.title
return msg
# 2 登入账号
def server(self):
import smtplib
# 明文传输端口号是25
# server = smtplib.SMTP(self.smtp_server, 25)
# TLS加密: 端口号是587,通信过程加密,邮件数据安全,使用正常的smtp端口。
# 对于TLS加密方式需要先建立SSL连接,然后再发送邮件。此处使用starttls()来建立安全连接
# server = smtplib.SMTP(self.smtp_server, 587)
# server.starttls()
# SSL加密: 端口号是465,通信过程加密,邮件数据安全。
server = smtplib.SMTP_SSL(self.smtp_server, 465)
server.login(self.from_addr, self.password)
return server
# 3 发送邮件
def send_msg(self):
email_msg = self.msg()
email_server = self.server()
try:
email_server.sendmail(self.from_addr, self.to_addr, email_msg.as_string())
email_server.quit()
return 1
except Exception as e:
return '邮件发送失败,错误代码为: %s' % e
forget_pass.html文件代码部分:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Forgot Password</title>
</head>
<body>
<form id="form" action="" method="post">
{% csrf_token %}
<span>
<input id="user" type="text" name="user" placeholder="请输入您的用户名">
<!--用户输入不存在时报错-->
{{ user_error }}
</span>
<br>
<span>
<input id="email" type="text" name="email" placeholder="请输入您注册时邮箱">
<!--用户输入不存在时报错-->
{{ email_error }}
</span>
<br>
<span>
<input id="submit" type="submit" value="提交">
</span>
</form>
<span>
{{ success }}
{{ send_email_failed }}
</span>
</body>
</html>