Photo by Webaroo on Unsplash
在現今大多數的網站,不管是註冊成功、重新設定密碼、優惠訊息或新商品上架等,都會透過電子郵件來通知客戶,是網站中不可或缺的傳遞訊息方式。除此之外,也有開發人員在運行爬蟲時,會將所爬取的資訊透過電子郵件來通知。
從以上的情境可以知道,電子郵件使用的頻繁及對網站功能的重要性,所以本文將利用Visual Studio Code開發工具,介紹如何透過Python來寄送電子郵件,並且客製化郵件樣版,重點包含:
從以上的情境可以知道,電子郵件使用的頻繁及對網站功能的重要性,所以本文將利用Visual Studio Code開發工具,介紹如何透過Python來寄送電子郵件,並且客製化郵件樣版,重點包含:
- 基本電子郵件內容
- 取得Gmail應用程式密碼
- 設定SMTP伺服器(SMTP Server)
- 電子郵件內容增加圖片
- 客製化郵件樣板(Templates)
一、基本電子郵件內容
首先,引用Python email標準函式庫(Standard Library)中的MIMEMultipart類別,如下範例:
from email.mime.multipart import MIMEMultipart
在email套件(Package)下的mime(Multipurpose Internet Mail Extensions)子套件,為網際網路媒體類型,定義了在網路上傳輸電子郵件的格式標準,在其底下的multipart子套件中,MIMEMultipart類別能夠讓電子郵件的格式包含純文字或HTML的內容。
而一封基本的電子郵件,分別有標題、寄件者、收件者及內容,透過MIMEMultipart物件即可進行各欄位的資料設定,如下範例:
而一封基本的電子郵件,分別有標題、寄件者、收件者及內容,透過MIMEMultipart物件即可進行各欄位的資料設定,如下範例:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
content = MIMEMultipart() #建立MIMEMultipart物件
content["subject"] = "Learn Code With Mike" #郵件標題
content["from"] = "pydemo123@gmail.com" #寄件者
content["to"] = "example@gmail.com" #收件者
content.attach(MIMEText("Demo python send email")) #郵件內容
範例中,郵件內容使用MIMEMultipart物件的attach方法(Method)進行設定,而內容需引用MIMEText類別來建立物件,第一個參數傳入文字內容,第二個參數可指定純文字或HTML,預設為純文字。HTML的郵件內容,在本文第五節客製化郵件樣版時,再來進行說明。
二、取得Gmail應用程式密碼
在Python專案中,要透過Gmail的SMTP伺服器來寄送電子郵件的話,需取得應用程式的專屬密碼,因為Google認為Python的smtplib函式庫是高風險的,所以用原Gmail密碼是無法透過應用程式來寄送電子郵件。以下為取得應用程式密碼的步驟:
步驟一:進入寄件者的Google帳戶。三、設定SMTP伺服器(SMTP Server)
Python專案中的電子郵件內容完成後,接下來就要設定Gmail的SMTP伺服器來寄送,設定方式如下範例:
import smtplib
with smtplib.SMTP(host="smtp.gmail.com", port="587") as smtp: # 設定SMTP伺服器
try:
smtp.ehlo() # 驗證SMTP伺服器
smtp.starttls() # 建立加密傳輸
smtp.login("pydemo123@gmail.com", "應用程式密碼") # 登入寄件者gmail
smtp.send_message(content) # 寄送郵件
print("Complete!")
except Exception as e:
print("Error message: ", e)
引用smtplib模組(Module),接著根據使用的SMTP伺服器,透過關鍵字參數(Keyword Argument)指定伺服器位置及埠號。另外,這邊利用Python的with陳述式,當郵件寄送完成後,自動釋放資源。
建立SMTP物件後,接下來利用ehlo()方法來驗證SMTP伺服器及埠號是否正確,下一步呼叫starttls()方法建立TLS(Transport Layer Security)傳輸,為一種網路傳輸安全協定,用來保護資料的安全及完整性。最後登入寄件者的Gmail帳戶,並且寄出郵件。這邊建議使用Python例外處理機制,因為在寄送電子郵件的過程中,非常有機會發生例外錯誤。
登入收件者的Gmail,即可看到剛剛所寄出的電子郵件,如下範例:
建立SMTP物件後,接下來利用ehlo()方法來驗證SMTP伺服器及埠號是否正確,下一步呼叫starttls()方法建立TLS(Transport Layer Security)傳輸,為一種網路傳輸安全協定,用來保護資料的安全及完整性。最後登入寄件者的Gmail帳戶,並且寄出郵件。這邊建議使用Python例外處理機制,因為在寄送電子郵件的過程中,非常有機會發生例外錯誤。
登入收件者的Gmail,即可看到剛剛所寄出的電子郵件,如下範例:
四、電子郵件內容增加圖片
如果想要在電子郵件中加入圖片,則需在Python專案中引用MIMEImage類別,並且引用pathlib函式庫來讀取圖片,如下範例:
from email.mime.image import MIMEImage
from pathlib import Path
在專案中加入一張圖片,本文以無尾熊koala.jpg來做示範,接著在設定郵件內容的地方,建立MIMEImage物件,傳入圖片的二進位碼,可透過Path物件的read_bytes()方法來進行讀取,如下範例:
content = MIMEMultipart() # 建立MIMEMultipart物件
content["subject"] = "Learn Code With Mike" # 郵件標題
content["from"] = "pydemo123@gmail.com" # 寄件者
content["to"] = "example@gmail.com" # 收件者
content.attach(MIMEText("Demo python send email")) # 郵件純文字內容
content.attach(MIMEImage(Path("koala.jpg").read_bytes())) # 郵件圖片內容
寄送完成後,登入收件者的Gmail,就可以看到電子郵件的內容成功增加了圖片,如下範例:
五、客製化郵件樣板(Templates)
實務上,除了純文字的郵件外,通常有機會需要依情況客製化郵件內容的格式,舉例來說,有些文字需要加上顏色、粗體及超連結等,這時候就可以使用HTML來依不同的需求分別客製化郵件樣板。
在Python專案中,新增一個名為success_template.html的檔案,假設當使用者註冊成功,您想要使用這個電子郵件樣版來進行通知。在開始設計樣郵件版前,這邊教大家一個小技巧,開啟success_template.html檔案後,在Visual Studio Code的右下角,可以看到語言模式,如下範例:
在Python專案中,新增一個名為success_template.html的檔案,假設當使用者註冊成功,您想要使用這個電子郵件樣版來進行通知。在開始設計樣郵件版前,這邊教大家一個小技巧,開啟success_template.html檔案後,在Visual Studio Code的右下角,可以看到語言模式,如下範例:
如果已經是HTML,無需變動,如果顯示其他語言則點選紅框處,在搜尋的地方輸入HTML,選擇即可。接下來在success_template.html檔案中的第一行輸入 ! 符號,按下Tab鍵,就會自動產生基本的HTML程式碼,如下範例:
由於電子郵件樣版不需要<head>標籤中的內容,所以可以進行刪除,接著在<body>標籤的區域中輸入郵件的格式化內容,如下範例:
此郵件樣版中,設定了一個user變數,前面加了 $ 符號,用來表示此參數為Python程式碼動態傳入,並且顯示粗體字型。而下方的Google字串則增加了超連結。
回到Python主程式,引用string模組(Module)的Template類別,用來替換郵件樣版中的參數值。如下範例:
回到Python主程式,引用string模組(Module)的Template類別,用來替換郵件樣版中的參數值。如下範例:
from string import Template
接著,建立Template物件,傳入郵件樣版內容,可以透過Path物件的read_text()方法來達成。最後呼叫Template物件的substitute()方法來設定郵件樣版中的參數值,其參數可傳入Python的字典(Dictionary)或關鍵字參數(Keyword Argument),如下範例:
template = Template(Path("success_template.html").read_text())
body = template.substitute({ "user": "Mike" })
在MIMEMultipart物件的指定郵件內容地方傳入body,並且設定為HTML的格式,如下範例第10行:
content = MIMEMultipart() # 建立MIMEMultipart物件
content["subject"] = "Learn Code With Mike" # 郵件標題
content["from"] = "pydemo123@gmail.com" # 寄件者
content["to"] = "example@gmail.com" # 收件者
template = Template(Path("success_template.html").read_text())
body = template.substitute({ "user": "Mike" })
content.attach(MIMEText(body, "html")) # HTML郵件內容
登入收件者的Gmail,即可看到客製化郵件樣版的結果,如下範例:
六、小結
以上教學參考Mosh Hamedani - The Complete Python Course線上課程,分享其中的重點及補充內容,希望看完本文能夠瞭解如何透過Python來寄送電子郵件,並且有能力客製化所需的郵件樣版,往後即可應用在各自的專案上。如果在練習的過程中有遇到任何問題,歡迎留言分享。
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
如果您喜歡我的文章,請幫我按五下Like(使用Google或Facebook帳號免費註冊),支持我創作教學文章,回饋由LikeCoin基金會出資,完全不會花到錢,感謝大家。
留言
張貼留言