串接 Gmail 寄送電子郵件
這篇教學會介紹使用 Python 的 smtplib 和 email 標準函式庫,實作出串接 Gmail 並寄送電子郵件的功能。
快速導覽:
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
Gmail 應用程式設定
要使用第三方程式 ( 例如 Python ) 串接 Gmail 寄送電子郵件,必須要設定 Google 的應用程式密碼,首先使用自己的 Google 帳號登入 Google,切換到個人設定頁面,選擇「安全性」頁籤,找到「登入 Google > 應用程式密碼」。
Google 於 2021 年已經移除「低安全性應用程式存取權」的功能,一律改用設定應用程式密碼的方式。
再次輸入密碼後,應用程式選擇「郵件」,並選擇自己執行 Python 的作業系統 ( 範例使用 Mac )。
點擊「產生」按鈕,就會產生一組郵件專屬的應用程式密碼,這組密碼「只會出現一次」,可使用記事本紀錄 ( 待會範例會使用 ),如果發現有不尋常的使用狀況,刪除後再重新產生一組新的即可。
使用 smtplib 函式庫
smtplib 是 Python 內建的標準函式庫,使用這個函式庫,可以透過 SMTP 寄送電子郵件,下方列出 smtplib 函式庫常用的方法:
SMTP 是「簡單郵遞傳送協定 Simple Mail Transfer Protocol」的縮寫,規定了電子郵件使用的格式、加密、以及郵件伺服器之間的傳遞方式 ( 參考:SMTP 維基百科 )。
方法 | 參數 | 說明 |
---|---|---|
smtplib.SMTP() | host, port | 指定 SMTP 伺服器網址以及連接埠號 ( 參考:透過其他電子郵件平台查看 Gmail )。 |
smtp.ehlo() | 使用 EHLO 向伺服器表明自己的身份。 | |
smtp.starttls() | 將 SMTP 連接設為 TLS ( 傳輸層安全 ) 模式,傳送的所有 SMTP 命令都會被加密。 | |
smtp.login() | email, password | 設定登入 SMTP 伺服器的 email 以及登入的密碼。 |
smtp.sendmail() | from, to, msg | 設定寄信的 email、收信的 email 和信件內容,信件內容限制只能英文,寄信成功後會返回一個空字典 {}。 |
smtp.sendmessage() | msg | 根據 MIME 訊息的內容寄信,寄信成功後會返回一個空字典 {}。 |
smtp.quit() | 中斷與 SMTP 伺服器的連接。 |
修改下方的程式碼,將自己的 email 與剛剛設定「郵件專屬的應用程式密碼」填入,執行後,就會透過 Gmail 寄出電子郵件。
msg 的格式為「Subject:標題內容\n信件內容」,第一個「\n」換行符號後方的是信件內容。
import smtplib
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('你的信箱','你的密碼')
from_addr = '你的信箱'
to_addr = '收件人信箱'
msg = 'Subject:title\nHello\nWorld!'
status = smtp.sendmail(from_addr, to_addr, msg)
if status == {}:
print('郵件傳送成功!')
else:
print('郵件傳送失敗...')
smtp.quit()
使用 email 函式庫
smtplib 函式庫雖然可以寄信,但卻無法使用 MIME 協定傳送中文、圖片或影音等非 ASCII 編碼的文件,需要搭配 email 函式庫,才能使用 MIME 協定寄送電子郵件。
MIME 是「多用途網際網路郵件擴展 Multipurpose Internet Mail Extensions」,表示一個可以擴展了電子郵件的網際網路協定,透過這個協定,電子郵件可以支援非 ASCII 編碼的文件 ( 參考:MIME 維基百科 )。
MIME 分成兩種格式,一種是 type,一種是 subtype,下方列出兩種格式裡常見項目:
type | 說明 |
---|---|
text | 文字 |
image | 圖片 |
audio | 聲音 |
video | 影片 |
application | 應用程式、二進位內容 |
multipart | 多種格式所組成的內容 |
subtype | 說明 |
---|---|
text/plain | 純文字 |
text/html | HTML 代碼 |
image/jpeg | jpg 圖片 |
image/gif | gif 圖片 |
image/png | png 圖片 |
video/mpeg | mpeg 影片 |
video/mp4 | mp4 影片 |
video/ogg | ogg 影片 |
application/pdf | pdf 文件 |
application/msword | word 文件 |
application/xhrml+xml | XHTML 文件 |
下方的程式碼,將原本的 smtplib 結合 email 函式庫,使用 MIMEText 設定訊息內容,並設定 Subject、From、To...等郵件屬性,最後使用 smtp.send_message 方法寄送電子郵件。
import smtplib
from email.mime.text import MIMEText
msg = MIMEText('你好呀!這是用 Python 寄的信~', 'plain', 'utf-8') # 郵件內文
msg['Subject'] = 'test測試' # 郵件標題
msg['From'] = 'oxxo' # 暱稱或是 email
msg['To'] = '[email protected]' # 收件人 email
msg['Cc'] = '[email protected], [email protected]' # 副本收件人 email ( 開頭的 C 大寫 )
msg['Bcc'] = '[email protected], [email protected]' # 密件副本收件人 email
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('你的信箱','你的密碼')
status = smtp.send_message(msg) # 改成 send_message
if status == {}:
print('郵件傳送成功!')
else:
print('郵件傳送失敗!')
smtp.quit()
HTML 網頁格式的 email
如果要寄送 HTML 網頁格式的 email,只要將原本 MIMEText 裡的 plain 換成 html,就能寄送 HTML 格式的信件,下方的程式碼執行後,會寄出帶有 h1 標題和兩個 div 的信件。
import smtplib
from email.mime.text import MIMEText
html = '''
<h1>hello</h1>
<div>這是 HTML 的內容</div>
<div style="color:red">紅色的字</div>
'''
mail = MIMEText(html, 'html', 'utf-8') # plain 換成 html,就能寄送 HTML 格式的信件
mail['Subject']='html 的信'
mail['From']='oxxo'
mail['To']='[email protected]'
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('你的信箱','你的密碼')
status = smtp.send_message(mail)
print(status)
smtp.quit()
附加檔案的 email
如果希望傳送的文件不僅有文字,也有附加檔案,就需要使用 email 的 MIMEMultipart() 方法,設定傳送多種格式所組成的內容,再透過 attach 將所需的內容加入,下方的程式碼不僅可以傳送 HTML 網頁內容的信件,也使用了 open 的方法開啟一張圖片作為附加檔案。
import smtplib
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
html = '''
<h1>hello</h1>
<div>這是 HTML 的內容</div>
<div style="color:red">紅色的字</div>
'''
msg = MIMEMultipart() # 使用多種格式所組成的內容
msg.attach(MIMEText(html, 'html', 'utf-8')) # 加入 HTML 內容
# 使用 python 內建的 open 方法開啟指定目錄下的檔案
with open('/content/drive/MyDrive/Colab Notebooks/meme.jpg', 'rb') as file:
img = file.read()
attach_file = MIMEApplication(img, Name='meme.jpg') # 設定附加檔案圖片
msg.attach(attach_file) # 加入附加檔案圖片
msg['Subject']='附件是一張搞笑的圖'
msg['From']='oxxo'
msg['To']='[email protected]'
smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('[email protected]','你申請的應用程式密碼')
status = smtp.send_message(msg)
print(status)
smtp.quit()
參考資料
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~