今天要來跟大家介紹如何用Python來寄Email。
大家可能認為寄Email是一件很Personal的事情,為什麼有需要用Python來做呢?
想像我是一個大債主💰,有很多人向我借錢。我有一個報表,裡面記錄著欠我錢的人的名字,Email,以及欠款金額。涉及隱私問題我們不能將報表寄給所有人,因此必須各別寄Email給該欠債者的人提醒他們。
一般的作法大概就是手動拷貝報表裡面的內容,再一個一個寄Email給大家吧?
但是如果人數很多,而且三天兩頭就得做這件事的話,真的是一件很麻煩的作業🙁。
類似上述的例子大家在工作或生活中可能也遇到過吧?
這時Python就可以派上用場了!💪
透過Python連結到Email伺服器,並自動化上述的流程,我們可以省下不少時間來追劇(誤
SMTP Server
首先第一步,往往也是令人感到困惑的部分,就是如何登錄到Email提供者的Server(譬如說Google的Gmail)。
我們會用到Python的內建模組 - smtplib來做這件事。
如同HTTP是專門用來傳輸網頁,SMTP(Simple Mail Transfer Protocol)是專門用來寄Email的規範(譬如說訊息的格式,加密,Server間的傳送等等)。而Python的smtplib所提供的功能就是來幫我們搞定這些事情。
每個Email服務提供者有他們自己的SMTP Server的網域名(Domain name)。譬如說:
Gmail - smtp.gmail.com
Yahoo - smtp.mail.yahoo.com
Hotmail - smtp-mail.outlook.com
一般來說,公司內部都會有自己的SMTP Server Domain Name,長得可能像 "smtp.mycompany.com"。要用公司系統寄信的話就必須要取得這部分的資訊(建議跟資安人員確認)。
Gmail
那麼,作為今天的例子,我們選擇的是目前最多人使用的- Gmail。
為了能夠用Python連上Gmail的SMTP Server,必須先做一些安全上的設定,這裡我建議兩個選項:
選項一:開一個新的Google帳戶(只用來測試),並將安全設定降低。
選項二:到既有的Google帳戶裡生成一個App password 。
個人覺得選項二(到既有的Google帳戶裡生成一個App password )應該是比較省力的作法。如同登入Gmail頁面時我們要輸入自設的密碼,這個App password是我們在Python程式中用來登入Gmail帳戶的密碼。
如果你選擇選項一(開一個新的Google帳戶,並將安全設定降低),那就使用自設密碼就好了。
OK,假設我們拿到了這個密碼,接下來就可以來試試看登錄了。來看看下面的Code:
話說,這裡稍微提醒一下,跟所有的密碼一樣,你不希望你的密碼被別人看到,所以實作上我們是不會將密碼暴露在程式碼裡面的。簡單的作法這裡你可以利用input這個函數,在程式作動中要求用戶輸入,譬如:
password = input("Please enter your password: ")
如果沒有得到錯誤訊息,就代表成功的登錄進Email帳戶囉!
寄出Email
下一步,就是來寄Email了。
方法非常的簡單,承接上面的code,SMTP物件提供.sendmail這個功能。如其名,.sendmail可以讓你將想要的Email內容,寄給你指定的對象。
smtp_server.sendmail(
sender_email,
receiver_email,
message)
如下面的例子,利用.sendmail,我們成功的利用Python寄出了第一封Email!
Email格式 - MIME
話說上述例子中,在信件內容的地方,我們會發現其實有一些必須要遵守的格式存在。
譬如說,我們先寫一個標題 "Subject: Hello from Bob",接著換行(利用\n)再寫Email的內容(body)本身。
這樣一來,標題的部分就會出現在Email的標題欄,而不會出現在信件內容本身。
這裡會用到Email的傳送格式叫做MIME(Multipurpose Internet Mail Extension) 。基本上這個格式除了包含我們剛剛看到信件本身的基本格式(像是主題或是收送件人),也讓我們可以指定傳送的內容種類(像是文字或是圖檔等),或者附檔等等。
只是,如果想做的事情更多(像是要加上附檔文件、圖檔),這個訊息內容格式也會變得越來越複雜,而自己要手寫出正確的格式也會變得更困難。
因此,我們通常會利用一個Python內建的小幫手模組,來幫我們建立這個訊息格式。
這個模組就叫做 - email (很直覺的名字吧😂)!
下面來看一下使用例子:
稍微解釋一下Code:
email模組中的MIMEMultipart是主要的核心物件。透過它產生的物件(msg),我們可以使用像dictionary的方式,在第8行的部分寫入Subject
msg["Subject"] = "Hello from Bob"
同樣的,我們可以設定寄件人(From)跟收件人(To)。
對於Email的內容主體,利用MIMEText,並指定文字的型態(譬如說Plain或是HTML等),此舉會幫我們製作Text body的格式。
body = MIMEText(txt, "plain")
接著用MIMEMultipart物件中的.attach將body加入,最後利用 .as_string將內容以string方式呈現,可以看到符合我們剛剛提到Email格式的內容被產生出來了😀!
因此,結合之前的smtplib的Code,我們可以將最後的內容的部分改成msg.as_string()(假設msg如上述所定義),就可以順利的送出正確的格式了喔!
Demo
現在我們知道怎麼利用Python來寄Email了,回到我們一開始提到的情境:
"我有一個報表,裡面有欠我錢的人的名字,Email,以及欠款金額。涉及隱私問題我們不能將報表寄給所有人,因此必須分別寄Email附上該欠債者的資料"
配合之前所學到的,加上利用For loop就可以輕鬆完成這項作業喔!
參考下面完整的Code:
小結
我們今天討論到:
利用Python寄Email的情境
何謂SMTP以及如何利用Python的smtplib來寄Email
幫助製作Email格式的Python模組
如何寄出客製化的Email給不同的收信人
避免篇幅過長消化不良,下一次我們再來跟大家介紹如何撰寫稍微更複雜的Email,像是在內容中加上連結或圖片,以及增添附檔。如果有興趣也可以參考官方的說明。
可以想像,使用Python寄Email的應用範圍相當的廣。在工作或是生活上都有機會利用到,可說是非常實用的技術,也符合我們的「讓Python更貼近生活」的理念🌸~
今天到這裡,希望對你有幫助喔!
Comments