1.前期准备(以QQ邮箱为例)
- 登录QQ邮箱
- 获取授权码
2.settings.py文件配置
1)缓存配置
# 配置缓存
CACHES = {# 邮件激活随机数"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/1", # 1表示redis第一个数据库"OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient",}}
}
2)发送邮件配置
# 发送邮件设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 固定写法
EMAIL_HOST = 'smtp.qq.com' # 腾讯QQ邮箱 SMTP 服务器地址
EMAIL_PORT = 25 # SMTP服务的端⼝号
EMAIL_HOST_USER = 'xxxx@qq.com' # 发送邮件的QQ邮箱
EMAIL_HOST_PASSWORD = '******' # 步骤1中获取的授权码
EMAIL_USE_TLS = True # 与SMTP服务器通信时,是否启动TLS链接(安全链接)默认false
3.配置路由
4.视图函数
- user/views.py
邮件发送
邮件发送代码写在用户注册的模块内(users)
# 二次开发 try一下# 发送激活邮件# 激活链接:http://XXX/active.html?code=xxx# code: base64(b"1016_zhaoliying")try:code_num = "%d" % random.randint(1000, 9999) # 生成随机数code = "%s_%s" % (code_num, uname)code = base64.urlsafe_b64encode(code.encode()).decode()# 存储随机数key = "active_email_%s" % unamecaches["default"].set(key, code_num, 3 * 3600 * 24)# 激活链接verify_url = 'http://127.0.0.1:7070/dadashop/templates/active.html?code=' + code# 发送激活邮件send_active_mail(email, verify_url)except Exception as e:print("send email error:", e)def send_active_mail(email, verify_url):"""发送激活邮件"""html_message = """尊敬的用户你好,请点击激活链接进行激活~~<a href="%s" target="_blank">点击此处</a>"""% verify_urlsend_mail(subject="dashopt激活邮件", # 题目message="", # 消息内容from_email="371659302@qq.com", # 发送者[当前配置邮箱]recipient_list=[email], # 接收者邮件列表html_message=html_message)
邮件激活
def active_mail(request):"""邮件激活视图逻辑1.获取查询字符串code[request.GET.get("")]2.校验code[Redis]3.激活用户[is_active=True]4.清除Redis中对应的缓存5.组织数据返回{'code': 200, 'data': '激活成功'}{'code': xxx, 'data': '错误原因'}"""code = request.GET.get("code")if not code:return JsonResponse({"code": 10102, "error": "Not code"})# 获取明文 1016_zhaoliyingcode_str = base64.urlsafe_b64decode(code.encode()).decode()number, username = code_str.split('_')key = "active_email_%s" % usernameredis_num = caches["default"].get(key)if number != redis_num:return JsonResponse({"code": 10103, "error": "Code error"})# orm更新try:user = UserProfile.objects.get(username=username, is_active=False)except Exception as e:print("Active error:", e)return JsonResponse({"code": 10104, "error": "username error"})user.is_active = Trueuser.save()# 清除缓存caches["default"].delete(key)return JsonResponse({"code": 200, "data": "激活成功"})