RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用Python批量定制化發(fā)送郵件

科技綠洲 ? 來源:Python實用寶典 ? 作者:Python實用寶典 ? 2023-11-01 11:32 ? 次閱讀

現(xiàn)實生活中,如果只是發(fā)郵件給自己,像上一篇文章那樣簡陋的格式是可以接受的,但若要針對每個人進(jìn)行郵件的定制化,群發(fā)給公司客戶、內(nèi)部員工、親戚朋友,則需更加高級的郵件發(fā)送方式。

我們可以通過HTML制作一封精美的元旦祝福郵件,但是郵件的內(nèi)容——比如姓名、祝福語等應(yīng)該怎樣動態(tài)渲染呢?答案是jinja2.

jinja2 是一個Python 的模板引擎,使用jinja2,我們能夠在郵件HTML中設(shè)定占位符,在Python發(fā)送郵件的時候,將指定文本渲染到該占位符中,實現(xiàn)動態(tài)渲染的目的。

舉一個jinja2的簡單例子:

from jinja2 import Template

name = 'Peter'
age = 34

tm = Template("My name is {{ name }} and I am {{ age }}")
msg = tm.render(name=name, age=age)

print(msg)

使用 {{}} 圈起來的是占位符,稱之為模板字符串。模板字符串呈現(xiàn)兩個變量:名稱和年齡,在這個例子中,硬編碼了name和age的值傳入模板,得到輸出:

My name is Peter and I am 34

在本篇文章中,我將教大家如何通過Html及Python+jinja2給你的親朋好友們定制元旦祝福郵件。

1.準(zhǔn)備

開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,請訪問這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。

如果你用Python的目的是數(shù)據(jù)分析,可以直接安裝Anaconda:Python數(shù)據(jù)分析與挖掘好幫手—Anaconda,它內(nèi)置了Python和pip.

此外,推薦大家用VSCode編輯器,因為它有許多許多的優(yōu)點:Python 編程的最好搭檔—VSCode 詳細(xì)指南。

準(zhǔn)備輸入命令安裝依賴,如果你沒有VSCode編輯器,Windows環(huán)境下打開 Cmd (開始-運行-CMD),蘋果系統(tǒng)環(huán)境下請打開 Terminal (command+空格輸入Terminal),如果你用的是VSCode編輯器或Pycharm,可以直接在下方的Terminal中輸入命令:

pip install jinja2
pip install yagmail

2.編寫HTML

將需要發(fā)送的郵件模板的HTML編寫好。并將占位符變量提前寫入HTML中。由于我的HTML文件過大,這里就不完全展示了,只展示幾個關(guān)鍵變量。

為簡化教程的復(fù)雜度,并盡可能覆蓋到知識點,這里我們使用4個變量:

1.LOGO圖片(讓你更好地理解圖片是如何渲染到HTMl里并發(fā)郵件)
2.背景圖片
3.祝福對象
4.祝福語言

首先,是圖片變量的配置:

< tr >
    < td valign="left" width="50%" class="logo sub-gd" style="padding-left:0;" >
        < h1 >
            < img src="data:image/png;base64, {{pythondict_img}}" >
        < /h1 >
    < /td >
< /tr >

由于我們需要發(fā)送html形的郵件,因此像代碼這樣將圖片轉(zhuǎn)碼為base64再發(fā)送是最方便的。

其中,base64部分用jinja2語法 {{}} 包起來,中間就是變量名,一會render渲染的時候就會將base64渲染進(jìn)來。

背景圖片的配置比較特殊,使用 base64 渲染的話QQ郵箱會自動過濾為#號,因此必須使用url的形式:

< td valign="middle"style="background-image: url({{backgroud}});" >

其次是祝福對象和祝福語言的配置:

< h2 >
    {{name}}
    < br >
    祝您2021年元旦快樂
< /h2 >
< p >
    {{bless}}.
< /p >

使用 {{}} 包裹變量,name是祝福的對象,bless是祝福語。這里簡化了代碼,還有許多樣式要配置詳細(xì)的大家可以看源代碼中的 index_detail.html .

對了,我們源代碼里包括兩份html,一份是 index_detail.html 是未經(jīng)過壓縮的源代碼,還有一份是 index.html,是被壓縮過的源代碼。

為什么要壓縮HTML呢?因為郵箱客戶端在解析HTML的時候,有可能會將換行符解析成
,因此壓縮HTML不保留任何空格和換行符是最保險的做法。

詳細(xì)的HTML代碼,大家可以看源代碼中的 index_detail.html .

3.Python代碼

發(fā)送郵件的方法,我們在 人人都能懂的 Python 自動發(fā)送郵件教程 中已經(jīng)詳細(xì)地講過了:

class Mail:
    """
    郵件相關(guān)類
    """

    def log(self, content):
        now_time = time.strftime(
            "%Y-%m-%d %H:%M:%S", time.localtime()
        )
        print(f'{now_time}: {content}')

    def sendmail(self, html, title, receivers):
        """
        發(fā)送郵件
        Arguments:
            html {str} -- 郵件正文(html)
            title {str} -- 郵件標(biāo)題
            receivers {list} -- 郵件接收者,數(shù)組
        """

        yag = yagmail.SMTP(
            host='您的郵箱SMTPHOST', user='您的郵箱',
            password='您的郵箱密碼', smtp_ssl=True
        )

        yag.send(receivers, title, html)
        self.log("郵件發(fā)送成功")

此外,為了渲染圖片,需要將圖片轉(zhuǎn)化為base64,這個方法是這樣的:

def get_image_base64(path):
    """
    獲得圖片的base64編碼

    Args:
        path (str): 圖片路徑

    Returns:
        str: base64編碼
    """
    import base64
    f = open(path, "rb")
    base64_data = base64.b64encode(f.read())
    f.close()
    return base64_data.decode("utf-8")

當(dāng)然,最重要的地方是下面這段代碼,需要針對每個人定制祝福語,我們可以采用字典的數(shù)據(jù)結(jié)構(gòu)來保存數(shù)據(jù):

bless_info = {
    "admin@pythondict.com": {
        "pythondict_img": get_image_base64("./images/pythondict.png"),
        "name": "實用寶典",
        "background": "https://背景圖片.jpg",
        "bless": "愿所有的幸運與您不期而遇..",
        "title": "祝寶典哥明年粉絲破十萬"
    },
    "test@qq.com": {
        "pythondict_img": get_image_base64("./images/pythondict.png"),
        "name": "老王",
        "background": "https://背景圖片.jpg",
        "bless": "祝您女兒明年考研順順利利,全家幸福安康..",
        "title": "老王,祝您元旦快樂!"
    },
}

可以看到 bless_info 字典里的每個key是發(fā)送對象的郵箱,而這些 key 對應(yīng)的value 中就有需要渲染到郵件的變量: pythondict_img , name , **background **及 祝福語 bless . 最后一個變量title,是用于指定郵件標(biāo)題的。

這樣,渲染+發(fā)送郵件做起來就方便多了:

tm = Template(open('./index.html', encoding="utf-8").read())
for mail in bless_info:
    msg = tm.render(bless_info[mail])
    Mail().sendmail(html=msg, title=bless_info[mail]["title"], receivers=[mail])

Mail().sendmail():是我們的發(fā)送郵件函數(shù),應(yīng)該不必多說。

bless_info[mail]:是需要渲染的變量,這里面的變量少了可不行,多了沒關(guān)系。

bless_info[mail]["title"]:就是剛剛在字典里指定的最后一個變量 title ,

由于 sendmail() 函數(shù)里的 receivers 是支持多人的,因此這里需要以數(shù)組的形式傳入函數(shù)。

不過這里還有一個有趣的改進(jìn),如果你需要用同一個模板郵件發(fā)送給同一家人,你可以這么做:

bless_info = {
    ...,
    "test1@qq.com,test2@qq.com,test3@qq.com": {
        "pythondict_img": get_image_base64("./images/pythondict.png"),
        "name": "老王一家",
        "background": "https://背景圖片.jpg",
        "bless": "祝王小女明年考研順順利利,老王全家幸福安康,吉祥如意..",
        "title": "老王一家,祝你們元旦快樂!"
    },
}

tm = Template(open('./index.html', encoding="utf-8").read())
for mail in bless_info:
    msg = tm.render(bless_info[mail])
    Mail().sendmail(html=msg, title=bless_info[mail]["title"], receivers=mail.split(","))

沒錯,只需要在key里將這一家人的郵箱用逗號分隔開,然后receivers里改為mail.split(","),你就能實現(xiàn)同一份郵件發(fā)給一家人的功能,是不是非常方便?

大家可以自己找喜歡的背景圖片,也可以用我在代碼里已給大家提供的圖片。想要去除LOGO的話,直接將pythondict_img設(shè)為空,或者設(shè)為你自己的卡片即可。

在源代碼目錄下運行代碼:

python mail.py

即可成功發(fā)送郵件,快打開編輯器試一下吧(記得先測試)!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 郵件
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    18805
  • HTML
    +關(guān)注

    關(guān)注

    0

    文章

    278

    瀏覽量

    35205
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    578

    瀏覽量

    20506
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4792

    瀏覽量

    84627
收藏 人收藏

    評論

    相關(guān)推薦

    Labview發(fā)送notes郵件

    請前輩點撥如何用labview發(fā)送notes郵件,公司用這個郵件系統(tǒng),但是通過用例的方式是無法發(fā)出郵件的,求教
    發(fā)表于 07-21 09:43

    何用python中的serial向串口發(fā)送和接收數(shù)據(jù)?

    何用python中的serial向串口發(fā)送和接收數(shù)據(jù)?
    發(fā)表于 11-22 06:35

    何用Foxmail Server搭建郵件服務(wù)器

    何用Foxmail Server搭建郵件服務(wù)器 Foxmail Server(以下簡稱FMS)可以搭建出功能強大的郵件服務(wù)器。本文以FMS For Windows 2.0為例,從其設(shè)置、管理、收
    發(fā)表于 01-27 17:05 ?1349次閱讀

    C#教程之調(diào)用Outlook發(fā)送郵件

    C#教程之調(diào)用Outlook發(fā)送郵件,很好的C#資料,快來學(xué)習(xí)吧。
    發(fā)表于 04-20 15:27 ?4次下載

    如何向您選擇的某人發(fā)送電子郵件

    您可以通過單擊左側(cè)的“發(fā)送”選項卡來確認(rèn)您的電子郵件是否已發(fā)送。它將顯示您發(fā)送的所有電子郵件。如果未顯示最近
    的頭像 發(fā)表于 12-13 16:35 ?5034次閱讀
    如何向您選擇的某人<b class='flag-5'>發(fā)送電子郵件</b>

    Python怎么批量生成PDF文檔

    這種模板套用的場景下,使用Python進(jìn)行自動就尤為方便,用最短的時間辦最高效的事。 今天就給大家講講如何用Python自動套用模板批量
    的頭像 發(fā)表于 02-28 10:11 ?1127次閱讀
    <b class='flag-5'>Python</b>怎么<b class='flag-5'>批量</b>生成PDF文檔

    基于SpringBoot實現(xiàn)郵件發(fā)送

    本項目通過Springboot發(fā)送email郵件,包括普通文本郵件 、HTML內(nèi)容板式郵件 、包含靜態(tài)資源郵件以及帶附件
    的頭像 發(fā)表于 02-28 14:58 ?1255次閱讀
    基于SpringBoot實現(xiàn)<b class='flag-5'>郵件</b><b class='flag-5'>發(fā)送</b>

    何用python發(fā)郵件呢?

    先做一些準(zhǔn)備,把郵件SMTP服務(wù)器、收發(fā)mail、郵件標(biāo)題和正文準(zhǔn)備好。
    的頭像 發(fā)表于 03-06 14:49 ?771次閱讀

    何用python發(fā)送接收郵件

    SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。
    的頭像 發(fā)表于 07-11 09:30 ?943次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>python</b><b class='flag-5'>發(fā)送</b>接收<b class='flag-5'>郵件</b>

    何用Python自動套用模板批量生成PDF文檔

    今天就給大家講講如何用Python自動套用模板批量生成的PDF文檔。 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上噢,如果沒有,請訪問這篇文章: 超詳細(xì)
    的頭像 發(fā)表于 10-17 10:54 ?974次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動套用模板<b class='flag-5'>批量</b>生成PDF文檔

    怎么用Python構(gòu)建一個自動發(fā)送郵件的腳本

    ? 類似的應(yīng)用場景還有很多,不僅僅是在股票策略提醒上,比如定時向某些人發(fā)送郵件;網(wǎng)站宕機(jī)了,實時發(fā)送郵件提醒;網(wǎng)站負(fù)載過高,發(fā)送
    的頭像 發(fā)表于 10-21 14:47 ?753次閱讀
    怎么用<b class='flag-5'>Python</b>構(gòu)建一個自動<b class='flag-5'>發(fā)送</b><b class='flag-5'>郵件</b>的腳本

    何用Python自動套用模板批量生成PDF文檔

    日常辦公中,經(jīng)常會使用PDF文檔,難免需要對PDF文檔進(jìn)行編輯,有時候PDF文檔中的大部分內(nèi)容都是一樣的,只是發(fā)送對象不同。 這種模板套用的場景下,使用Python進(jìn)行自動就尤為方便,用最短的時間
    的頭像 發(fā)表于 10-31 10:56 ?1551次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Python</b>自動套用模板<b class='flag-5'>批量</b>生成PDF文檔

    怎么用Python構(gòu)建一個自動發(fā)送郵件的腳本

    呢? 類似的應(yīng)用場景還有很多,不僅僅是在股票策略提醒上,比如定時向某些人發(fā)送郵件;網(wǎng)站宕機(jī)了,實時發(fā)送郵件提醒;網(wǎng)站負(fù)載過高,發(fā)送
    的頭像 發(fā)表于 10-31 16:36 ?545次閱讀
    怎么用<b class='flag-5'>Python</b>構(gòu)建一個自動<b class='flag-5'>發(fā)送</b><b class='flag-5'>郵件</b>的腳本

    利用Python發(fā)送郵件的 3 種方式

    1. 前言 郵件,作為最正式規(guī)范的溝通方式,在日常辦公過程中經(jīng)常被用到 我們都知道 Python內(nèi)置了對 SMTP 的支持,可以發(fā)送純文本、富文本、HTML 等格式的郵件 本文將聊聊利
    的頭像 發(fā)表于 11-02 11:37 ?962次閱讀

    如何使用Python編寫腳本來自動發(fā)送郵件

    Python是一種非常流行的編程語言,可以用于多種用途,包括自動任務(wù)。其中一個常見的自動任務(wù)是自動發(fā)送郵件。在本文中,我們將介紹如何使用
    的頭像 發(fā)表于 12-07 11:36 ?1351次閱讀
    RM新时代网站-首页