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": "激活成功"})