top of page
Search
Learn with Shin

利用Python寄Email

Updated: Mar 16, 2022



今天要來跟大家介紹如何用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)。譬如說:



一般來說,公司內部都會有自己的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:



  • 我們這裡利用SMTP_SSL來產生一個加密的SMTP連結物件,並利用物件中的.login來做登錄的動作。

  • 在生成SMTP_SSL物件時,除了smtp server的網域名之外,還需要port碼。利用SSL登錄的情況下我們需要用到465(一般來說Default會是587)。


話說,這裡稍微提醒一下,跟所有的密碼一樣,你不希望你的密碼被別人看到,所以實作上我們是不會將密碼暴露在程式碼裡面的。簡單的作法這裡你可以利用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


Post: Blog2_Post
bottom of page