主頁 > 後端開發 > Django筆記三十八之發送郵件

Django筆記三十八之發送郵件

2023-05-09 07:47:50 後端開發

本文首發于公眾號:Hunter后端

原文鏈接:Django筆記三十八之發送郵件

這一篇筆記介紹如何在 Django 中發送郵件,

在 Python 中,提供了 smtplib 的郵件模塊,而 Django 在這個基礎上對其進行了封裝,我們可以通過 django.core.mail 來呼叫,

以下是本篇筆記的目錄:

  1. 郵件配置項
  2. send_mail
  3. EmailMessage
  4. 復用郵件發送連接
  5. 開發階段除錯設定

1、郵件配置項

在正式發送郵件前,我們需要在 settings.py 里設定幾個引數,如下:

# hunter/settings.py

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'     
EMAIL_PORT = 465   
EMAIL_HOST_USER = '[email protected]'  
EMAIL_HOST_PASSWORD = 'JBDMVIXSHYxxxxx' 
EMAIL_USE_SSL = True
EMAIL_USE_TLS = False

這些配置項在 log 日志記錄那一篇筆記中有過介紹,那是我們指定日志等級發送郵件的功能,這里再做一下簡單的介紹,

EMAIL_BACKEND 是我們指定的郵箱后端,在后面我們會介紹在開發除錯階段的時候可以設定的其他值

EMAIL_HOST 發送郵箱的主機地址,這里我們使用的是 163 郵箱的地址

EMAIL_PORT EMAIL_HOST 使用的埠

EMAIL_HOST_USER 發件人郵箱地址

EMAIL_HOST_PASSWORD 163 郵箱開啟了 SMTP 服務提供的授權碼

EMAIL_USE_SSL 與 SMTP 服務器對話時是否使用隱式 TLS 連接,這種型別被稱為 SSL,通常在 465 埠使用,這個欄位與 EMAIL_USE_TLS 是互相排斥的,只能設定一個為 True

EMAIL_USE_TLS 與 SMTP 服務器對話是否使用 TLS 連接,一般在 587 埠

以上就是在 Django 里使用 163 郵箱的一個配置項示例,

2、send_mail

配置好之后我們就可以嘗試發送一下郵件,最簡單的使用示例如下:

from django.core.mail import send_mail

send_mail(
    subject="subject 主題",
    message="郵件主體",
    from_email="[email protected]",
    recipient_list=["[email protected]"],
)

在上面的呼叫中,subject 是發送的郵件的標題,

message 是郵件發送的正文內容,

from_email 是發送郵件的郵箱

recipient_list 是接收收件人串列,可以接收多個郵箱地址

對于 message 引數,接收的是純文本資訊,會將引數內容直接顯示在郵件正文,如果是想對文本進行更多操作,比如加大字體,加粗,或者加上表格等操作,可以使用 html_message 引數來替代 message 引數,

比如:

send_mail(
    subject="subject 主題",
    from_email="[email protected]",
    recipient_list=["[email protected]"],
    html_message="<h1>html main body</h1>"
)

在這里,html_message 將引數內容當作一個 html 文本進行決議,發送郵件后就可以在接收郵箱看到大號的文本字體了,

發送批量郵件

如果有批量發送郵件的需求,可以使用 send_mass_mail 方法,

from django.core.mail import send_mass_mail

message_1 = ("郵件標題1", "郵件正文1", "[email protected]", ["[email protected]"])
message_2 = ("郵件標題2", "郵件正文2", "[email protected]", ["[email protected]"])
send_mass_mail(
    (message_1, message_2)

該方法接收串列引數,其中串列的每一個元素的引數和引數順序都是固定的,分別是郵件標題,正文,郵件發送人,和郵件接收人串列,

注意: 因為批量發送的引數是固定的,所以并不支持 send_mail 里的 html_message 引數,

3、EmailMessage

前面介紹的 send_mail() 方法簡單可用,但是并不支持郵件里的附件、抄送等功能,接下來我們使用 EmailMessage 這個類來實作這些額外的功能,

以下是使用 EmailMessage 實作發送郵件的簡單示例:

from django.core.mail import EmailMessage

email = EmailMessage(
    subject="郵件標題",
    body="郵件主體",
    from_email="[email protected]",
    to=["[email protected]"],
)
email.send()

引數名稱與 send_mail() 略有不同,這里的郵件正文是 body,接收人串列為 to,

這里在實體化 EmailMessage 之后,呼叫 send() 方法即可發送郵件,

除了上面的這些引數,還有 bcc,實作的是密送功能,也是郵件接收人串列,cc 是抄送人串列,

還有 attachments 引數,實作的是附件功能,接下來介紹幾種發送附件的方式:

發送附件

1. attachments 引數

我們可以直接在 EmailMessage() 中添加附件引數,attachments 引數接收一個串列,串列元素也是一個串列,內層的這個串列接收三個元素,第一個元素為檔案名,第二個元素為檔案內容,第三個元素為指定的附件的 MIME 型別,第三個引數省略的話就會參考附件的檔案名自動選擇,

我們在系統根目錄下創建兩個檔案 a.txt, b.txt,然后實作示例如下:

from django.core.mail import EmailMessage

attachments = []
for file_name in ["./a.txt", "./b.txt"]:
    with open(file_name, "r") as f:
        content = f.read()
        attachments.append((file_name, content))


email = EmailMessage(
    subject="郵件標題",
    body="郵件主體",
    from_email="[email protected]",
    to=["[email protected]"],
    attachments=attachments,
)
email.send()
2. attach() 方法

除了直接在 EmailMessage 實體中添加引數,我們還可以使用 attach() 方法,

示例如下:

email = EmailMessage(
    subject="郵件標題",
    body="郵件主體",
    from_email="[email protected]",
    to=["[email protected]"],
)


file_name_1 = "./a.txt"
f = open(file_name_1, "r")
file_content_1 = f.read()
f.close()


email.attach(file_name_1, file_content_1)
email.send()
3. attach_file() 方法

還有一個方式是使用 attach_file() 方法,引數內容是檔案路徑+檔案名,系統會自動為我們決議該檔案:

email = EmailMessage(
    subject="郵件標題",
    body="郵件主體",
    from_email="[email protected]",
    to=["[email protected]"],
)

email.attach_file("./b.txt")
email.send()

EmailMessage 發送 html 正文

前面介紹了在 send_mail() 方法可以通過 html_message 的引數發送 html 頁面的郵件,在 EmailMessage 也可以實作,但是需要修改 content_subtype 屬性,

默認情況下,EmailMessage.content_subtype 是 "plain",我們將其改為 "html" 即可發送 html 頁面的郵件,

email = EmailMessage(
    subject="郵件標題",
    body="<h1>郵件主體</h1>",
    from_email="[email protected]",
    to=["[email protected]"],
)
email.content_subtype = "html"
email.send()

4、復用郵件發送連接

因為發送郵件涉及到網路連接及可能存在的大量資料的傳送,比如附件,

所以,如果是在介面中有發送郵件的需求,我們可以通過 celery 的異步任務實作發送郵件的功能,

而郵件的發送會涉及到 SMTP 連接的創建和關閉,所以復用連接也是一個好的方式,

這里介紹兩種方式:

send_messages

send_messages() 方法接收 EmailMessage 實體串列,然后實作批量發送的功能:

from django.core import mail
from django.core.mail import EmailMessage

email_1 = EmailMessage(
    subject="郵件標題1",
    body="郵件主體1",
    from_email="[email protected]",
    to=["[email protected]"],
)
email_2 = EmailMessage(
    subject="郵件標題2",
    body="郵件主體2",
    from_email="[email protected]",
    to=["[email protected]"],
)


connection = mail.get_connection()
messages = [email_1, email_2]
connection.send_messages(messages)

手動控制 connection

我們可以手動控制 connection 的創建和關閉,

from django.core import mail

connection = mail.get_connection()

email_1 = mail.EmailMessage(
    subject="郵件標題1",
    body="郵件主體1",
    from_email="[email protected]",
    to=["[email protected]"],
    connection=connection
)
email_1.send()


email_2 = mail.EmailMessage(
    subject="郵件標題2",
    body="郵件主體2",
    from_email="[email protected]",
    to=["[email protected]"],
)


email_3 = mail.EmailMessage(
    subject="郵件標題3",
    body="郵件主體3",
    from_email="[email protected]",
    to=["[email protected]"],
)
messages = [email_2, email_3]
connection.send_messages(messages)


connection.close()

在這里,email_1 的呼叫增加了 connection 引數,email_2 和 email_3 也是使用 connection 進行的批量發送

這個程序中,connection 一直沒有關閉,所以復用的是同一個連接,直到最后呼叫 close() 才算是手動關閉了這個 connection 連接,

5、開發階段除錯設定

在開發階段,我們除錯發送郵件功能的時候,有時候并不想每次都真的發送郵件給指定賬戶,盡管可能是測驗賬號,我們有時候只想看一下輸出的內容,可以更改郵箱配置的后端

console

我們可以在 settings.py 里設定:

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

這樣,在呼叫我們前面的 send 方法后,系統就不會發送郵件給 to 的接收人串列了,而是會在控制臺輸出我們的郵件資訊:
類似如下:

Content-Type: text/html; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject: =?utf-8?b?6YKu5L2qCH6aKY?=
From: [email protected]
To: [email protected]
Date: Fri, 17 Feb 2023 18:01:21 -0000
Message-ID: 
 <167665688132.1114.884170460108140763@1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa>


<h1>郵件主體</h1>
-------------------------------------------------------------------------------

filebased

在除錯階段,我們還可以指定將郵件的內容輸出到檔案,同樣的修改郵件后端配置:

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = './emails_file'

這里設定了郵件后端為檔案,EMAIL_FILE_PATH 則是指定了郵件內容放到系統根目錄下的 emails_file 檔案中,

呼叫了發送郵件的函式后,在這個檔案夾下就會多出一個檔案,檔案內容是我們前面在 console 控制臺輸出的內容

如果想獲取更多后端相關文章,可掃碼關注閱讀:
image

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551902.html

標籤:其他

上一篇:【深入淺出 Yarn 架構與實作】6-3 NodeManager 分布式快取

下一篇:返回列表

標籤雲
其他(158625) Python(38123) JavaScript(25405) Java(18024) C(15222) 區塊鏈(8262) C#(7972) AI(7469) 爪哇(7425) MySQL(7171) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5336) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4567) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1965) Web開發(1951) HtmlCss(1932) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Django筆記三十八之發送郵件

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記三十八之發送郵件 這一篇筆記介紹如何在 Django 中發送郵件。 在 Python 中,提供了 smtplib 的郵件模塊,而 Django 在這個基礎上對其進行了封裝,我們可以通過 django.core.mail 來呼叫。 以下是本 ......

    uj5u.com 2023-05-09 07:47:50 more
  • 【深入淺出 Yarn 架構與實作】6-3 NodeManager 分布式快取

    不要跳過這部分知識,對了解 NodeManager 本地目錄結構,和熟悉 Container 啟動流程有幫助。 一、分布式快取介紹 主要作用就是將用戶應用程式執行時,所需的外部檔案資源下載快取到各個節點。 YARN 分布式快取作業流程如下: 客戶端將應用程式所需的檔案資源 (外部字典、JAR 包、二 ......

    uj5u.com 2023-05-09 07:47:41 more
  • Java后端真實、靠譜、強大的面試題網站:面試梯

    ? 本文分享一個給力的Java后端面試題網站:面試梯。 網址:https://offer.skyofit.com 這套題真實、高頻、全面、有詳細答案、保你穩過面試,讓你成為offer收割機。題目包括:Java基礎、多執行緒、JVM、資料庫、Redis、Shiro、Spring、SpringBoot、M ......

    uj5u.com 2023-05-09 07:47:35 more
  • spring事務傳播的Propagation.REQUIRES_NEW以及NEVER MANDATORY

    NEVER 不使用事務,如果當前事務存在,則拋出例外 驗證: @Service public class PrService { @Autowired PrDao dao; @Transactional public void savea() { dao.a();//保存第一條資料 saveb(); ......

    uj5u.com 2023-05-09 07:47:31 more
  • 第三章-Java的基本程式設計結構

    3.1一個簡單的Java語言程式 這是程式雖然很簡單,但是所有的Java程式都具有這種結構,因此還是值得花一些時間來研究的。首先,Java區分大小寫。如果出現了大小寫拼寫錯誤(例如:將main拼寫成Main),程式將無法運行。 下面逐行的查看這段源代碼。關鍵字pubilc稱為訪問修飾符(access ......

    uj5u.com 2023-05-09 07:47:23 more
  • python快速直白入門(半新手向,老手復習向)

    主用python做專案有一段時間,這次簡單總結學習下。為后面的專案撰寫,進行一次基礎知識的查缺補漏、 1、變數名和資料型別 """ 變數名,只能由" 數字、大小寫字母、_ " 組成,且不能以數字開頭 """ # 整數 int # hashable,不可變物件 a = 5 # 浮點數 float # ......

    uj5u.com 2023-05-09 07:41:56 more
  • Python第三方庫安裝教程、什么是第三方庫

    Python有一個全球社區:https://pypi.org/,在這里我們可以搜索任何主題的Python第三方庫。PyPI全稱是Python Package Index,指的是Python包的索引,它由PSF(Python Software Foundation)來維護,并且展示全球Python計算 ......

    uj5u.com 2023-05-09 07:41:50 more
  • 【9種】ElasticSearch分詞器詳解,一文get!!!| 博學谷狂野架構師

    ElasticSearch 分詞器 作者: 博學谷狂野架構師 GitHub:GitHub地址 (有我精心準備的130本電子書PDF) 只分享干貨、不吹水,讓我們一起加油!😄 概述 分詞器的主要作用將用戶輸入的一段文本,按照一定邏輯,分析成多個詞語的一種工具 什么是分詞器 顧名思義,文本分析就是把全 ......

    uj5u.com 2023-05-09 07:39:19 more
  • Scala學習總結(一)

    Scala學習總結 一、Scala簡介 Scala特點: Scala 是一門多范式 (multi-paradigm) 的編程語言 ,設計初衷是要集成面向物件編程和函式式編程的各種 特性。 Scala 是一門以 java 虛擬機 (JVM) 為運行環境的編程語言 ,Scala 源代碼(.scala)會 ......

    uj5u.com 2023-05-09 07:38:51 more
  • JVM面試和學習中需要注意的部分

    在學習jvm的時候許多人處于迷茫的狀態,對一些基礎的知識反而聽過就忘了,這篇筆記是我在學習jvm的時候隨手記的一些,適合已經學過或者了解過的小伙伴復習回顧一下,當然知識的覆寫是沒有的,主要記錄了我覺得容易忘記或者記錯的知識點,這些有很多是基石知識,希望大家不要忘記,大家看到就當正好復習一下,對大家的 ......

    uj5u.com 2023-05-09 07:38:26 more