Stories

Detail Return Return

【Django開發】django美多商某城項目完整開發4.0第9篇:郵件與驗證,使用Django發送郵件【附代碼文檔】 - Stories Detail

🏆🏆🏆教程全知識點簡介:1.郵件驗證系統包括Django發送郵件、保存郵箱併發送驗證郵件、Celery使用Django配置文件設置。2. 地址管理涵蓋shou貨地址、省市區地址查詢、數據庫建表、後端接口設計、前端實現、緩存使用(安裝、使用方法、省市區視圖緩存、緩存數據保存位置和有效期設置)、用户地址管理。3. 數據庫設計包括用户部分、產品部分、數據庫表設計、表結構、數據庫模型類。4. 容器化部署涵蓋Docker使用(Ubuntu安裝、啓動停止、鏡像操作)、FastDFS客户端與自定義文件存儲系統、頁面靜態化、定時任務、靜態化首頁腳本。5. 產品系統包括產品詳情頁、異步任務觸發、腳本工具、用户瀏覽歷史記錄(保存、查看)。6. 產品模式涵蓋B2B企業對企業、C2C個人對個人、O2O線上到線下、開發流程、需求分析。7. 購wu車系統包括購wu車管理、購wu車數據存儲設計(Redis保存已登錄用户)、添加到購wu車、查詢購wu車數據、登錄合併購wu車。8. 訂order單系統涵蓋提交訂order單、我的訂order單、訂order單評價、訂order單結算、保存訂order單、MySQL事務隔離級別修改、下單成功頁面。9. 搜索系統包括產品搜索、搜索引擎原理、Elasticsearch、Docker安裝Elasticsearch擴展、前端實現。10. 支fu系統涉及 集成、Xadmin管理後台。11. 項目配置包括項目準備、配置文件修改、數據庫配置、Redis配置、本地化語言時區、異常處理、日誌記錄。12. 用户認證系統涵蓋圖片驗證碼、域名設置、前端Vue代碼、跨域CORS、Celery發送短信、賬號存在判斷、JWT認證(JWT概念、構成、應用、Django REST framework JWT)、 登錄(登錄流程、模型類創建、urllib使用、回調處理)、用户中心個人信息。

<!-- start:bj1 -->

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047166553    中查看

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000046720728    中查看

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

郵件與驗證

學習目標:
  • 使用Django發送郵件的方法
  • 郵件激活的機制
業務説明:

在用户中心頁面中, 允許用户設置郵箱

當用户點擊保存後, 會向用户發送郵件以驗證郵箱的有效性。

為了避免用户未收到驗證郵箱, 提供“重新發送驗證郵件”按鈕允許用户重新發送郵件。

郵箱驗證成功,顯示已驗證。

技術説明:

在郵件中提供的激活鏈接地址,為了能區分是哪個用户在進行郵箱驗證,需要在鏈接中包含用户和郵箱的識別信息,如user_id和email數據,但是基於安全性的考慮,不能將這兩個數據直接暴露在郵件鏈接中,而是需要進行隱藏和簽名處理(能夠檢測出是否修改過鏈接數據)。可以使用前面學過的itsdangerous對user_id和email數據進行處理,生成token作為鏈接的參數。

使用Django發送郵件

Django中內置了郵件發送功能,被定義在django.core.mail模塊中。發送郵件需要使用SMTP服務器,常用的免費服務器有:163、126、,下面以163郵件為例。

1)註冊163郵箱itcast88,登錄後設置。

2)在新頁面中點擊“客户端授權 ”,勾選“開啓”,彈出新窗口填寫手機。

3)填寫授權碼。

4)提示開啓成功。

5) 在Django配置文件中,設置郵箱的配置信息

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
  
  
#發送郵件的郵箱
  
  
EMAIL_HOST_USER = 'itcast88@163.com'
  
  
#在郵箱中設置的客户端授權 
  
  
EMAIL_HOST_PASSWORD = 'python808'
  
  
#收件人看到的發件人
  
  
EMAIL_FROM = 'python<itcast88@163.com>'

6) 使用Django提供的模塊發送郵件

django.core.mail模塊提供了send_mail來發送郵件。

send_mail(subject, message, from_email, recipient_list,html_message=None)

  • subject 郵件標題
  • message 普通郵件正文, 普通字符串
  • from_email 發件人
  • recipient_list 收件人列表
  • html_message 多媒體郵件正文,可以是html字符串

例如:

Pandas 文檔

msg='<a href="http://www.itcast.cn/subject/pythonzly/index.shtml" target="_blank">點擊激活</a>'
send_mail('註冊激活','',settings.EMAIL_FROM, ['itcast88@163.com'], html_message=msg)

保存郵箱併發送驗證郵件

W3Schools Python

後端接口設計:

請求方式:PUT /email/

請求參數: JSON 或 表單

參數 類型 是否必須 説明
email str Email郵箱

返回數據: JSON

返回值 類型 是否必須 説明
id int 用户id
email str Email郵箱

在users/serializers.py中新建序列化器,用户驗證用户提交的郵箱信息。

class EmailSerializer(serializers.ModelSerializer):
    """
    郵箱序列化器
    """
    class Meta:
        model = User
        fields = ('id', 'email')
        extra_kwargs = {
            'email': {
                'required': True
            }
        }

    def update(self, instance, validated_data):
        instance.email = validated_data['email']
        instance.save()
        return instance

在users/views.py中創建新視圖,用於保存用户的郵箱信息,注意需要用户登錄通過認證後。

from rest_framework.permissions import IsAuthenticated

class EmailView(UpdateAPIView):
    """
    保存用户郵箱
    """
    permission_classes = [IsAuthenticated]
    serializer_class = serializers.EmailSerializer

    def get_object(self, *args, **kwargs):
        return self.request.user

設置路由信息

url(r'^emails/$', views.EmailView.as_view()),  # 設置郵箱

補充發送驗證郵件

在保存郵箱的時候,需要向用户發送驗證郵件, 將發送郵件的工作放到celery中異步執行。

在celery*tasks目錄中新建email目錄和email/*_init**.py文件和email/tasks.py文件

email/tasks.py文件中是實現發送郵件的異步任務

from celery_tasks.main import celery_app
from django.core.mail import send_mail
from django.conf import settings


@celery_app.task(name='send_verify_email')
def send_verify_email(to_email, verify_url):
    """
    發送驗證郵箱郵件
    :param to_email: 收件人郵箱
    :param verify_url: 驗證鏈接
    :return: None
    """
    subject = "美多商某城郵箱驗證"
    html_message = '<p>尊敬的用户您好!</p>' \
                   '<p>感謝您使用美多商某城。</p>' \
                   '<p>您的郵箱為:%s 。請點擊此鏈接激活您的郵箱:</p>' \
                   '<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)
    send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)
注意

在發送郵件的異步任務中,需要用到django的配置文件,所以 需要修改celery的啓動文件main.py,在其中指明celery可以讀取的django配置文件,並且註冊添加email的任務

from celery import Celery

  
  
# 為celery使用django配置文件進行設置
  
  
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'

  
  
# 創建celery應用
  
  
celery_app = Celery('meiduo')

  
  
# 導入celery配置
  
  
celery_app.config_from_object('celery_tasks.config')

  
  
# 自動註冊celery任務
  
  
celery_app.autodiscover_tasks(['celery_tasks.sms', 'celery_tasks.email'])
在User模型類中定義生成驗證郵箱鏈接的方法

郵箱的激活鏈接是用户點擊時會訪問的網址, 讓用户點擊時進入到success_verify_email.html頁面。

def generate_verify_email_url(self):
        """
        生成驗證郵箱的url
        """
        serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)
        data = {'user_id': self.id, 'email': self.email}
        token = serializer.dumps(data).decode()
        verify_url = 'http://www.meiduo.site:8080/success_verify_email.html?token=' + token
        return verify_url
修改EmailSerializer序列化器的update方法,增加發送郵件
def update(self, instance, validated_data):
        email = validated_data['email']
        instance.email = email
        instance.save()

        # 生成驗證鏈接
        verify_url = instance.generate_verify_email_url()
        # 發送驗證郵件
        send_verify_email.delay(email, verify_url)
        return instance

前端

修改user_center_info.js文件,增加save_email方法

// 保存email
        save_email: function(){
            var re = /^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$/;
            if(re.test(this.email)) {
                this.email_error = false;
            } else {
                this.email_error = true;
                return;
            }
            axios.put(this.host + '/email/',
                { email: this.email },
                {
                    headers: {
                        'Authorization': 'JWT ' + this.token
                    },
                    responseType: 'json'
                })
                .then(response => {
                    this.set_email = false;
                    this.send_email_btn_disabled = true;
                    this.send_email_tip = '已發送驗證郵件'
                })
                .catch(error => {
                    alert(error.data);
                });
        }

sys 文檔

驗證郵箱鏈接

當用户點擊郵箱裏的鏈接時,進入到success_verify_email.html頁面。

在該頁面中, 將請求網址中用於驗證的token發送給後端接口,由後端接口判斷token的有效性,如果token有效,則修改郵箱的驗證狀態,並將處理結果返回給前端展示給用户。

後端接口設計:

請求方式:GET /emails/verification/?token=xxx

請求參數: 查詢字符串參數

|參數|類型|是否必須|説明

user avatar u_16756731 Avatar Leesz Avatar chongdianqishi Avatar huajianketang Avatar sovitjs Avatar jianweilai Avatar daishuyunshuzhanqianduan Avatar python-learn Avatar ichu Avatar hightopo Avatar xixindeshoutao Avatar tully_l Avatar
Favorites 34 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.