本文讲解网站开发中常见的注册模块中邮箱激活功能。
发送邮件
Django中内置了邮件发送功能,发送邮件需要SMTP服务器支持,本文采用第三方QQ邮箱的SMTP服务器来配置。
1.登陆QQ邮箱,进入设置
2.进入账户,开启SMTP服务
开启POP3/SMTP服务
再开启IMAP/SMTP服务
3.获取授权码
复制上图的授权码(打码部分)待后面配置用。
4.配置
打开项目的settings.py,在最后面加入以下配置内容
# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
# 发送邮件的邮箱 (需要修改成你的QQ邮箱)
EMAIL_HOST_USER = '123456789@qq.com'
# 在邮箱中获取的16位授权密码 (需要修改成刚刚获取的授权码)
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxxxxxxx'
# 收件人看到的发件人 (需要修改成你的QQ邮箱)
EMAIL_FROM = '超级商城<123456789@qq.com>'
5.发送邮件
Django使用send_mail来发送邮件,需要导入send_mail函数from django.core.mail import send_mail
from django.core.mail import send_mail
class RegisterView(View):
"""
用户注册视图
"""
def post(self, request):
# 其他代码
# ...
# 主题
subject = '超级商城欢迎注册'
# message表示发送的纯文本,
# 如果需要发送带样式的,则使用html_message
# 用html_message时,message为空字符串
message = ''
# 收件人列表
receiver =
# 需要发送的带样式内容
html_message = '<h1>欢迎注册超级商城账号</h1>' \
'请点击下面链接激活您的账号<br>'
# 发送者
sender = settings.EMAIL_FROM
# 发送邮件
send_mail(subject, message, sender, receiver, html_message=html_message)
return HttpResponse('OK')
这样就成功实现了发送邮件功能,当用户进行注册时,提交表单时就会送到邮件。
补充(itsdangerous库)
上面讲解中其实并没有在邮件内容中加入激活链接。一般利用用户id来组成URL放在邮件中让用户来激活,但是考虑到直接使用id会存在安全问题,用户可能会恶意进行访问注册,所以一般会将其加密来组成URL。这里介绍的是itsdangerous库。在处理激活视图中获取URL中加密的id,进行解密后便可在数据库中给指定的用户激活字段设置为True。
安装itsdangerous库
pip install itsdangerous
加密用户信息
from django.shortcuts import render, HttpResponse
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
from django.conf import settings
class RegisterView(View):
"""
用户注册视图
"""
def post(self, request):
# 其他代码
# ...
# 加密用户信息
#################################################################
# 第一个参数是加盐,这里使用的是配置文件里Django框架自动生成的字符串
# 第二个参数是过期时间,以秒为单位,这里设置的是1小时
serializer = Serializer(settings.SECRET_KEY, 3600)
info = {'confirm': user.id}
# 加密。指定utf8编码
token = serializer.dumps(info).decode()
#################################################################
# 主题
subject = '超级商城欢迎注册'
# message表示发送的纯文本,
# 如果需要发送带样式的,则使用html_message
# 用html_message时,message为空字符串
message = ''
# 收件人列表
receiver =
# 需要发送的带样式内容
html_message = '<h1>%s,欢迎注册超级商城账号</h1>' \
'请点击下面链接激活您的账号<br>' \
'<a href=http://127.0.0.1:8000/user/active/%s>' \
'http://127.0.0.1:8000/user/active/%s</a>' % (username, token, token)
# 发送者
sender = settings.EMAIL_FROM
# 发送邮件
send_mail(subject, message, sender, receiver, html_message=html_message)
return HttpResponse('OK')
解密用户信息
from django.shortcuts import render, HttpResponse
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
from django.conf import settings
class ActiveView(View):
"""
用户激活视图
"""
def get(self, request, token):
# 解密用户信息
# 加密时如何实例化,解密就如何实例化
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
# 解密。加密前是什么类型的数据,解密后也是什么类型数据
info = serializer.loads(token)
id = info['confirm']
user = User.objects.get(id=id)
user.is_active = True
user.save()
return HttpResponse('OK')
# 过期后会触发SignatureExpired异常
except SignatureExpired:
return HttpResponse('激活链接已过期')
本文作者: Ifan Tsai (菜菜)
本文链接: https://www.caiyifan.cn/p/e06b99aa.html
版权声明: 本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
未经允许不得转载:木盒主机 » Django 发送注册激活邮箱