使用 Python 寄送電子郵件指南:從基礎到進階的完整教學【支援 Gmail】

1. 前言

使用 Python 傳送電子郵件是一項在個人應用程式或商業系統中非常實用的技能。例如,您可以透過應用程式自動向使用者發送通知,或即時將系統錯誤日誌寄送給管理者。此外,透過程式碼取代手動寄信,能有效提升工作效率,達成日常業務的自動化。

Python 內建的標準函式庫中包含了「smtplib」模組,無需安裝額外套件即可實現基本的電子郵件傳送功能。本文將說明使用 Python 傳送電子郵件的基本設定與步驟,並透過實際程式碼範例,介紹如 HTML 格式郵件、附加檔案的郵件、Gmail 的安全性設定,以及日文郵件與群發郵件等進階應用。

閱讀完本指南後,您將能輕鬆地使用 Python 寄送電子郵件,並學會應用在各種實際情境中的技巧。

2. 如何使用 Python 傳送電子郵件

在 Python 中傳送電子郵件時,我們會使用標準函式庫中的「smtplib」模組。透過這個模組,只需要撰寫簡單的程式碼,就可以透過 SMTP 伺服器傳送郵件。以下將詳細說明 smtplib 模組的基本介紹與基本寄信流程。

smtplib 模組介紹

smtplib 模組是 Python 標準函式庫的一部分,支援 SMTP(簡單郵件傳輸協定)客戶端功能。使用這個模組,可以讓 Python 程式直接連接到 SMTP 伺服器,並寄送電子郵件。

smtplib 的主要特點

  • 可輕鬆與 SMTP 伺服器進行通訊。
  • 內建於 Python 中,無需額外安裝其他模組,設定簡單方便。
  • 支援安全性設定與錯誤處理功能。

基本寄信流程

以下說明使用 Python 傳送電子郵件的基本步驟。只要按照這些步驟操作,就可以順利完成寄信。

1. 連接到 SMTP 伺服器

首先,您需要先連接到 SMTP 伺服器。這是寄送郵件的第一步。常見的 SMTP 伺服器有 Gmail、Yahoo Mail、Outlook 等,當然您也可以使用企業自建的 SMTP 伺服器。

import smtplib

# 設定 SMTP 伺服器
smtp_server = "smtp.example.com"  # 例如:Gmail 為「smtp.gmail.com」
smtp_port = 587  # 一般使用的連接埠,Gmail 為 587

2. 設定登入認證

與 SMTP 伺服器連線成功後,接下來需要使用您的電子郵件帳號與密碼登入。特別是使用 Gmail 等服務時,可能需要額外設定安全性選項。

# 電子郵件帳號資訊
username = "your_email@example.com"
password = "your_password"

# 建立連線並登入
server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()  # 啟用加密連線
server.login(username, password)

3. 撰寫並傳送郵件

接下來,您需要撰寫郵件的內容,包括收件人地址、主旨與內文,然後透過 SMTP 伺服器傳送出去。

# 郵件內容設定
to_address = "recipient@example.com"
subject = "測試郵件"
body = "這是一封由 Python 發送的測試郵件。"

# 郵件格式
message = f"Subject: {subject}

{body}"

# 寄送郵件
server.sendmail(username, to_address, message)
print("郵件已成功發送!")

4. 錯誤處理要點

與 SMTP 伺服器連線及寄信過程中,可能會遇到錯誤。因此,建議使用 try-except 區塊來妥善處理例外狀況。

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(username, password)
    server.sendmail(username, to_address, message)
    print("郵件已成功發送!")
except Exception as e:
    print("郵件發送失敗:", e)
finally:
    server.quit()  # 關閉連線

小結

以上是使用 Python 進行基本電子郵件傳送的完整流程。掌握這些步驟後,您就可以開始進一步自動化寄信流程,例如一次寄送多封郵件或定時發信。下一節將介紹如何實作文字郵件、HTML 郵件與附加檔案的寄信方式。

3. 實作:Python 傳送電子郵件的程式碼範例

從這裡開始,我們將介紹實際使用 Python 傳送電子郵件的程式碼範例。包括如何傳送文字郵件、HTML 郵件,以及附加檔案的郵件,會依照步驟詳細說明。

傳送純文字郵件

首先是最基本的格式——純文字郵件。我們將使用 smtplib 模組傳送簡單的文字內容。

程式碼範例

import smtplib

# 電子郵件帳號資訊
smtp_server = "smtp.example.com"
smtp_port = 587
username = "your_email@example.com"
password = "your_password"

# 收件人與內容
to_address = "recipient@example.com"
subject = "純文字郵件測試"
body = "這是一封由 Python 傳送的純文字格式電子郵件。"

# 郵件格式
message = f"Subject: {subject}

{body}"

try:
    # 連線至伺服器
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(username, password)
    server.sendmail(username, to_address, message)
    print("純文字郵件已成功發送!")
except Exception as e:
    print("郵件發送錯誤:", e)
finally:
    server.quit()

傳送 HTML 郵件

接著說明如何傳送 HTML 格式的郵件。HTML 郵件可以讓內容更豐富,例如加入樣式、圖片或連結。這裡會使用「email.mime」模組來處理 HTML 內容。

程式碼範例

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# 電子郵件帳號資訊
smtp_server = "smtp.example.com"
smtp_port = 587
username = "your_email@example.com"
password = "your_password"

# 收件人與內容
to_address = "recipient@example.com"
subject = "HTML 郵件測試"
html_content = '''
<html>
  <body>
    <h1>您好</h1>
    <p>這是一封由 <strong>Python</strong> 傳送的 HTML 格式郵件。</p>
    <a href="https://example.com">點我前往網站</a>
  </body>
</html>
'''

# 建立郵件內容
message = MIMEMultipart()
message["From"] = username
message["To"] = to_address
message["Subject"] = subject
message.attach(MIMEText(html_content, "html"))

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(username, password)
    server.sendmail(username, to_address, message.as_string())
    print("HTML 郵件已成功發送!")
except Exception as e:
    print("郵件發送錯誤:", e)
finally:
    server.quit()

傳送附加檔案的郵件

接下來介紹如何傳送帶有附件的電子郵件,例如附加 PDF 或圖片檔案。這裡會使用 email.mime 模組中的 MIMEBase 類別來處理檔案部分。

程式碼範例

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

# 電子郵件帳號資訊
smtp_server = "smtp.example.com"
smtp_port = 587
username = "your_email@example.com"
password = "your_password"

# 收件人與內容
to_address = "recipient@example.com"
subject = "附加檔案郵件測試"
body = "這封郵件包含附加檔案,請參閱附件內容。"

# 建立郵件內容
message = MIMEMultipart()
message["From"] = username
message["To"] = to_address
message["Subject"] = subject
message.attach(MIMEText(body, "plain"))

# 附加檔案
filename = "example.pdf"  # 要附加的檔案名稱
with open(filename, "rb") as attachment:
    part = MIMEBase("application", "octet-stream")
    part.set_payload(attachment.read())
    encoders.encode_base64(part)
    part.add_header("Content-Disposition", f"attachment; filename={filename}")
    message.attach(part)

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(username, password)
    server.sendmail(username, to_address, message.as_string())
    print("附加檔案郵件已成功發送!")
except Exception as e:
    print("郵件發送錯誤:", e)
finally:
    server.quit()

小結

透過以上程式碼範例,您已經學會如何使用 Python 傳送不同格式的電子郵件。根據需求可以選擇傳送純文字、HTML 或附加檔案的郵件。下一節將進一步說明如何使用 Gmail 作為寄信伺服器,並設定相關安全性參數。

4. 使用 Gmail 傳送電子郵件

本節將詳細說明如何使用 Python 搭配 Gmail 寄送電子郵件。Gmail 是非常普遍的郵件服務平台,且提供方便使用的 SMTP 伺服器。不過,若要透過程式從 Gmail 發信,您需要完成幾項安全性設定。

Gmail 的 SMTP 設定

使用 Gmail 寄送郵件時,請使用以下 SMTP 設定:

  • SMTP 伺服器: smtp.gmail.com
  • 連接埠: 587(使用 TLS)或 465(使用 SSL)
  • 驗證: 必須開啟

基本設定程式碼範例

import smtplib
from email.mime.text import MIMEText

# Gmail 的 SMTP 設定
smtp_server = "smtp.gmail.com"
smtp_port = 587
username = "your_email@gmail.com"
password = "your_password"

# 收件人與內容
to_address = "recipient@example.com"
subject = "Gmail 郵件測試"
body = "這是一封透過 Python 及 Gmail 發送的郵件。"

# 建立郵件內容
message = MIMEText(body)
message["From"] = username
message["To"] = to_address
message["Subject"] = subject

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # 啟用 TLS 加密
    server.login(username, password)
    server.sendmail(username, to_address, message.as_string())
    print("Gmail 郵件已成功發送!")
except Exception as e:
    print("郵件發送錯誤:", e)
finally:
    server.quit()

安全性設定注意事項

當您使用 Gmail 帳號傳送郵件時,Google 會對外部應用程式存取進行限制。為了讓 Python 有權限登入並發送郵件,您需要設定以下項目:

申請應用程式專用密碼

  1. 啟用兩步驟驗證:前往 Gmail 帳號設定,開啟兩步驟驗證功能,這是開啟應用程式密碼功能的必要條件。
  2. 產生應用程式密碼:在「Google 帳戶 > 安全性 > 應用程式密碼」中,產生一組專用於 Python 程式的密碼,並用來替代一般登入密碼。

其他注意事項

  • 妥善管理應用程式密碼:請勿將密碼分享給他人,並妥善儲存。
  • 提升帳號安全性:建議使用應用程式密碼來避免帳號遭到未授權存取。

使用應用程式密碼的程式碼範例

下列程式碼範例展示如何使用 Gmail 的應用程式密碼來寄送電子郵件:

import smtplib
from email.mime.text import MIMEText

smtp_server = "smtp.gmail.com"
smtp_port = 587
username = "your_email@gmail.com"
app_password = "your_app_password"  # 使用應用程式密碼

to_address = "recipient@example.com"
subject = "Gmail 應用程式密碼測試"
body = "這封郵件是透過應用程式密碼由 Gmail 發送的。"

message = MIMEText(body)
message["From"] = username
message["To"] = to_address
message["Subject"] = subject

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(username, app_password)
    server.sendmail(username, to_address, message.as_string())
    print("Gmail 郵件已成功發送!")
except Exception as e:
    print("郵件發送錯誤:", e)
finally:
    server.quit()

小結

當您使用 Gmail 作為寄信伺服器時,帳號的安全性設定尤其重要。透過設定應用程式密碼,不僅能提升安全性,也能順利從 Python 程式發送郵件。下一節將介紹更多進階功能,包括群發、定時寄送以及寄送日文內容等技巧。

5. 進階篇:進階的電子郵件傳送技巧

本節將介紹 Python 傳送電子郵件的進階應用技巧。包括一次傳送給多位收件者、定時自動寄送郵件,以及使用日文內容寄送郵件等,滿足實務上的需求。

一次傳送給多位收件者

使用 Python,您可以輕鬆地一次傳送電子郵件給多位收件者。只要正確設定「To」、「Cc」、「Bcc」欄位,並使用清單管理收件人,即可實現群發功能。

程式碼範例

以下為設定多個「To」收件人的程式碼範例:

import smtplib
from email.mime.text import MIMEText

# SMTP 伺服器資訊
smtp_server = "smtp.gmail.com"
smtp_port = 587
username = "your_email@gmail.com"
password = "your_app_password"

# 收件人清單
to_addresses = ["recipient1@example.com", "recipient2@example.com"]
subject = "多位收件者郵件測試"
body = "這是一封群發給多位收件者的郵件。"

# 建立郵件內容
message = MIMEText(body)
message["From"] = username
message["To"] = ", ".join(to_addresses)  # 用逗號連接多個收件人
message["Subject"] = subject

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(username, password)
    server.sendmail(username, to_addresses, message.as_string())
    print("群發郵件已成功發送!")
except Exception as e:
    print("郵件發送錯誤:", e)
finally:
    server.quit()

定時自動寄送郵件

若您希望定期自動寄送郵件,可使用「schedule」或「time」模組來排程。可設定在特定時間點自動發送,例如每天早上九點。

程式碼範例(使用 schedule 自動寄信)

import smtplib
from email.mime.text import MIMEText
import schedule
import time

def send_email():
    smtp_server = "smtp.gmail.com"
    smtp_port = 587
    username = "your_email@gmail.com"
    password = "your_app_password"
    to_address = "recipient@example.com"
    subject = "定時發送郵件"
    body = "這是一封定時自動發送的郵件。"

    message = MIMEText(body)
    message["From"] = username
    message["To"] = to_address
    message["Subject"] = subject

    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.starttls()
        server.login(username, password)
        server.sendmail(username, to_address, message.as_string())
        print("郵件已成功發送!")
    except Exception as e:
        print("郵件發送錯誤:", e)
    finally:
        server.quit()

# 每天上午 9:00 自動寄信
schedule.every().day.at("09:00").do(send_email)

while True:
    schedule.run_pending()
    time.sleep(1)

上述程式會在每天上午 9 點自動寄出郵件。

寄送日文郵件

當您要寄送包含日文內容的電子郵件時,需特別注意編碼設定。主旨與內容需使用 UTF-8 編碼,確保收件人能正確顯示日文。

程式碼範例(日文支援)

import smtplib
from email.mime.text import MIMEText
from email.header import Header

smtp_server = "smtp.gmail.com"
smtp_port = 587
username = "your_email@gmail.com"
password = "your_app_password"
to_address = "recipient@example.com"

# 日文主旨與內容
subject = Header("日文郵件測試", "utf-8")
body = "這是一封以日文內容撰寫,並由 Python 發送的電子郵件。"

message = MIMEText(body, "plain", "utf-8")
message["From"] = username
message["To"] = to_address
message["Subject"] = subject

try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(username, password)
    server.sendmail(username, to_address, message.as_string())
    print("日文郵件已成功發送!")
except Exception as e:
    print("郵件發送錯誤:", e)
finally:
    server.quit()

小結

本節介紹了 Python 寄送電子郵件的進階技巧。透過群發功能、定時寄送、自訂語言支援等方式,您可以更靈活地應用電子郵件功能於不同的實務需求中。下一節將整理本文的重點,作為快速回顧與參考。

6. 總結

本文完整介紹了如何使用 Python 傳送電子郵件,從基礎設定到進階應用皆有涵蓋。利用內建的「smtplib」模組即可輕鬆完成寄信功能,應用於日常工作或開發專案中皆非常實用。

以下為各節重點回顧:

  1. 基本寄信流程
  • 學習使用 smtplib 模組,透過 SMTP 伺服器寄送郵件。
  • 說明從撰寫郵件到發送與錯誤處理的完整流程。
  1. 實作範例
  • 介紹了純文字、HTML、附加檔案等不同格式的郵件發送方式。
  • 學會根據需求靈活變化程式碼,對應各種應用場景。
  1. 使用 Gmail 寄信
  • 說明 Gmail 的 SMTP 設定與安全性處理(應用程式密碼)。
  • 提醒需啟用兩步驟驗證與使用應用程式密碼提高安全性。
  1. 進階技巧
  • 介紹群發、定時發送與日文內容支援等進階應用技巧。
  • 強調多語系郵件與自動化設定的重要性。

如何善用本教學

透過本教學,您可以輕鬆使用 Python 架設自動寄信機制、定期通知系統或整合進應用程式中。這些技能在實務上極具價值,可應用於客戶通知、系統監控或資訊推播等多種用途。

Python 寄送郵件的功能具有高度彈性與擴充性,無論是技術開發還是商務應用皆能發揮效益。歡迎立即實作、整合到您的專案中,提升自動化效率與專業表現。