iT邦幫忙

0

如何使用 Python 發送 Gmail 電子郵件:基於 SMTP 和 TLS 的完整指南(含範例程式碼)

  • 分享至 

  • xImage
  •  

1. Gmail 的 SMTP 伺服器

SMTP(簡單郵件傳輸協定) 是網際網路電子郵件傳送的基礎協定,負責處理電子郵件的發送與接收。在這篇文章中,我們會使用 Gmail 的 SMTP 伺服器來發送電子郵件。

Gmail 的 SMTP 伺服器資訊如下:

伺服器地址:smtp.gmail.com

端口號:587(用於 TLS 安全傳輸)

當我們發送電子郵件時,SMTP 伺服器會充當中介,幫助我們將郵件從寄件者傳送到收件者的郵件伺服器。

2. TLS(傳輸層安全性協定)

TLS(Transport Layer Security) 是一種加密協定,專為在網路上提供通信安全性而設計。當我們發送電子郵件時,啟用 TLS 可以加密郵件的內容,確保在郵件傳送過程中,資料不會被攔截或洩露。

在這篇文章的程式碼中,我們會使用 starttls() 方法來啟用 TLS 加密。這是目前 Gmail SMTP 伺服器所要求的安全措施,確保我們的郵件在發送過程中是安全的。

3. Gmail 應用程式密碼

在 Gmail 的安全性設置中,Google 不再允許直接使用帳戶密碼進行 SMTP 認證。如果你想要讓應用程式(如我們的 Python 程式)能夠使用 Gmail 發送郵件,你需要生成一個應用程式專用密碼。

如何生成 Gmail 應用程式密碼:

  • 登入你的 Gmail 帳戶。
  • 前往 Google 帳戶的安全性頁面。
  • 在「登入 Google」部分,啟用兩步驟驗證。
  • 啟用後,你將看到「應用程式密碼」選項,點擊生成並選擇「郵件」和「使用的設備」。
  • 生成的 16 位應用程式密碼即是我們稍後程式碼中使用的密碼。
  • 這個密碼與你的 Gmail 帳號密碼不同,且專門用於特定應用程式的登入使用,這樣可以提升帳號的安全性。

兩步驟驗證
https://ithelp.ithome.com.tw/upload/images/20241022/20170078AZOWkITZNp.png

應用程式密碼
https://ithelp.ithome.com.tw/upload/images/20241022/20170078yudPleOBAR.png
生成應用程式密碼(此密碼為後續使用)
https://ithelp.ithome.com.tw/upload/images/20241022/20170078giyHprP23z.png

4. Python 程式碼實作

現在,我們有了 SMTP 伺服器資訊、TLS 安全性認證的知識,以及 Gmail 應用程式密碼,接下來我們將使用 Python 撰寫程式,透過 Gmail 發送電子郵件。

定義一個名為 send_email 的函式 :

def send_email(sender_email, receiver_email, password, subject, body):
    """
    寄送電子郵件的函式
    
    參數:
    - sender_email: 寄件者的 Email
    - receiver_email: 收件者的 Email
    - password: 寄件者 Gmail 的應用程式密碼
    - subject: 郵件主題
    - body: 郵件內容
    """

該函式接受五個參數:

  • sender_email: 發送電子郵件的帳號。
  • receiver_email: 接收者的電子郵件地址。
  • password: Gmail 應用程式的密碼(這裡應使用專門的應用程式密碼,而不是一般帳戶密碼)。
  • subject: 郵件的主題。
  • body: 郵件的內容,通常是文字。

設置電子郵件內容 :

    # 建立 MIMEMultipart 物件
    message = MIMEMultipart()
    message["From"] = sender_email
    message["To"] = receiver_email
    message["Subject"] = subject

這段程式碼使用 MIMEMultipart 建立一個多部分的電子郵件物件,這樣可以方便地附加主題、收件者和寄件者等資訊。


添加郵件內容

    # 將郵件內容附加到郵件中
    message.attach(MIMEText(body, "plain"))
  • 這行程式將純文字形式的郵件內容附加到 MIMEMultipart 物件中。
  • MIMEText 可用來定義郵件的內容格式,這裡我們使用的是 "plain",表示郵件內容為純文字格式。
  • 如果需要發送 HTML 格式的郵件,可以將 "plain" 改為 "html"。

設定 Gmail 的 SMTP 伺服器

    # 使用 Gmail 的 SMTP 伺服器
    smtp_server = "smtp.gmail.com"
    port = 587  # Gmail 的 SMTP 伺服器端口
  • 這裡定義了 Gmail 的 SMTP 伺服器地址和端口。
  • Gmail 使用 smtp.gmail.com 來處理 SMTP(簡單郵件傳輸協定)請求,並且端口號 587 是用於 TLS 加密連線。

發送Gmail郵件

    try:
        # 連線到 Gmail 的 SMTP 伺服器
        server = smtplib.SMTP(smtp_server, port)
        server.starttls()  # 啟用安全連線 (TLS)

        # 登入 Gmail 帳戶
        server.login(sender_email, password)

        # 寄送郵件
        server.sendmail(sender_email, receiver_email, message.as_string())
        print("郵件已成功發送")

    except Exception as e:
        print(f"發送郵件時發生錯誤: {e}")

    finally:
        # 關閉連線
        server.quit()

1. smtplib.SMTP 用來建立一個到 Gmail SMTP 伺服器的連線。

2. server.starttls() 啟用 TLS(傳輸層安全性協定),這是確保資料傳輸過程中的加密保護。

3. server.login 使用寄件者的電子郵件和應用程式密碼進行身份驗證。

4. server.sendmail 發送郵件,並將 message 轉換為字串格式。

在 try-except 結構中,若有任何錯誤發生,將捕獲並打印出錯誤訊息,最後確保無論如何都會關閉與 SMTP 伺服器的連線。


範例用法

# 範例用法
sender = "您的寄件電子郵件@gmail.com"
receiver = "您的接收電子郵件@gmail.com"
password = "應用程式密碼"
subject = "有關於你的程式碼"

body = """
您好,

這是一封簡單的純文字郵件,感謝您對我們的支持。

祝好,
發件者姓名
"""

send_email(sender, receiver, password, subject, body)

透過 Gmail 帳號寄送一封簡單的電子郵件。
https://ithelp.ithome.com.tw/upload/images/20241022/20170078d1vIGil8tb.png

注意事項

  • Gmail 應用程式密碼:由於 Google 加強了安全性,因此不能使用 Gmail 帳號的普通密碼來進行 SMTP 認證,必須產生專用的應用程式密碼。
  • 啟用安全性較低的應用程式存取:如果遇到登入失敗的情況,可能需要在 Gmail 帳戶設定中允許安全性較低的應用程式存取。

這篇文章簡單介紹了如何透過 Python 發送電子郵件。這個方法不僅能寄送純文字郵件,還可以進一步擴展來發送包含附件、圖片、甚至 HTML 格式的郵件。


完整程式碼

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

def send_email(sender_email, receiver_email, password, subject, body):
    """
    寄送電子郵件的函式
    
    參數:
    - sender_email: 寄件者的 Email
    - receiver_email: 收件者的 Email
    - password: 寄件者 Gmail 的應用程式密碼
    - subject: 郵件主題
    - body: 郵件內容
    """
    
    # 建立 MIMEMultipart 物件
    message = MIMEMultipart()
    message["From"] = sender_email
    message["To"] = receiver_email
    message["Subject"] = subject

    # 將郵件內容附加到郵件中
    message.attach(MIMEText(body, "plain"))

    # 使用 Gmail 的 SMTP 伺服器
    smtp_server = "smtp.gmail.com"
    port = 587  # Gmail 的 SMTP 伺服器端口

    try:
        # 連線到 Gmail 的 SMTP 伺服器
        server = smtplib.SMTP(smtp_server, port)
        server.starttls()  # 啟用安全連線 (TLS)

        # 登入 Gmail 帳戶
        server.login(sender_email, password)

        # 寄送郵件
        server.sendmail(sender_email, receiver_email, message.as_string())
        print("郵件已成功發送")

    except Exception as e:
        print(f"發送郵件時發生錯誤: {e}")

    finally:
        # 關閉連線
        server.quit()

# 範例用法
sender = "your_email@gmail.com"
receiver = "recipient_email@gmail.com"
password = "your_application_password"
subject = "測試郵件"

body = """
您好,

這是一封由 Python 程式發送的測試郵件。

祝好,
發件者姓名
"""

send_email(sender, receiver, password, subject, body)


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言