iT邦幫忙

2023 iThome 鐵人賽

0
Software Development

跟著 OXXO 一起學 Python系列 第 71

( Day 34.2 ) Python 串接 Gmail 寄送電子郵件

  • 分享至 

  • xImage
  •  

這篇教學會介紹使用 Python 的 smtplib 和 email 標準函式庫,實作出串接 Gmail 並寄送電子郵件的功能。

原文參考:串接 Gmail 寄送電子郵件

本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )

Gmail 應用程式設定

要使用第三方程式 ( 例如 Python ) 串接 Gmail 寄送電子郵件,必須要設定 Google 的應用程式密碼,首先使用自己的 Google 帳號登入 Google,切換到個人設定頁面,選擇「安全性」頁籤,找到「登入 Google > 應用程式密碼」。

Google 於 2021 年已經移除「低安全性應用程式存取權」的功能,一律改用設定應用程式密碼的方式。

Python 教學 - 串接 Gmail 寄電子郵件 - Gmail 應用程式設定

再次輸入密碼後,應用程式選擇「郵件」,並選擇自己執行 Python 的作業系統 ( 範例使用 Mac )。

Python 教學 - 串接 Gmail 寄電子郵件 - Gmail 應用程式設定

點擊「產生」按鈕,就會產生一組郵件專屬的應用程式密碼,這組密碼「只會出現一次」,可使用記事本紀錄 ( 待會範例會使用 ),如果發現有不尋常的使用狀況,刪除後再重新產生一組新的即可。

Python 教學 - 串接 Gmail 寄電子郵件 - Gmail 應用程式設定

使用 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()

Python 教學 - 串接 Gmail 寄電子郵件 - 使用 smtplib 函式庫

使用 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'] = 'oxxo.studio@gmail.com'   # 收件人 email
msg['Cc'] = 'oxxo.studio@gmail.com, XXX@gmail.com'   # 副本收件人 email ( 開頭的 C 大寫 )
msg['Bcc'] = 'oxxo.studio@gmail.com, XXX@gmail.com'  # 密件副本收件人 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()

Python 教學 - 串接 Gmail 寄電子郵件 - 使用 email 函式庫

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']='oxxo.studio@gmail.com'

smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('你的信箱','你的密碼')
status = smtp.send_message(mail)
print(status)
smtp.quit()

Python 教學 - 串接 Gmail 寄電子郵件 - HTML 網頁格式的 email

附加檔案的 email

如果希望傳送的文件不僅有文字,也有附加檔案,就需要使用 email 的 MIMEMultipart() 方法,設定傳送多種格式所組成的內容,再透過 attach 將所需的內容加入,下方的程式碼不僅可以傳送 HTML 網頁內容的信件,也使用了 open 的方法開啟一張圖片作為附加檔案。

參考:內建函式 ( 檔案讀寫 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']='oxxo.studio@gmail.com'

smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()
smtp.starttls()
smtp.login('oxxo.studio@gmail.com','你申請的應用程式密碼')
status = smtp.send_message(msg)
print(status)
smtp.quit()

Python 教學 - 串接 Gmail 寄電子郵件 - 附加檔案的 email

參考資料

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 34.1 ) Python 使用 Google Cloud Functions
下一篇
( Day 35.1 ) Python 讀取 Google 試算表
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言