CodeGym /課程 /Python SELF TW /郵件處理

郵件處理

Python SELF TW
等級 24 , 課堂 2
開放

8.1 讀取郵件

我覺得我們已經對網路的基本操作有了足夠的了解。讓我們來做些更有趣的事吧——網路中有這麼多有趣的東西。怎麼樣來讀取和發送郵件呢?

電子郵件出現已有 50 年了,比第一個瀏覽器早了 20 年。那時候人們使用特別的程式來發送郵件。這對我們意味著什麼呢?就是說這個郵件工作標準(協議)簡單得不得了。

協議 POP3(Post Office Protocol version 3)用於從郵件伺服器獲取電子郵件。與 IMAP 不同,POP3 通常會把郵件下載到 本地電腦並從伺服器上刪除。在 Python 中,可以使用 poplib 庫來操作 POP3

注意: 與 POP3 不同的是,IMAP(Internet Message Access Protocol)可以在伺服器上存儲郵件並在設備之間同步狀態。如果你從多個設備讀取郵件,IMAP 更方便,而 POP3 更適合在單一設備上本地存儲郵件。

獲取郵件列表的主要步驟:

  • 連接到郵件伺服器。
  • 身份驗證。
  • 獲取郵件列表。
  • 下載和閱讀郵件。
  • 從伺服器斷開連接。

要編寫第一個應用程式,我們需要兩個庫:poplibemail。如果你還沒有它們,請安裝。如何使用 pip 管理員你已經知道了。

重要: 在處理電子郵件時,請始終遵循安全措施。永遠不要在代碼中明文存儲密碼。使用環境變數或安全存儲來存放帳戶信息。而且,確保你的代碼不會公開,以避免洩露機密信息。

1. 連接和身份驗證:

通過 SSL 連接到郵件伺服器,並使用指定的帳戶信息登入郵箱。


mailbox = poplib.POP3_SSL(pop3_server)
mailbox.user(username)
mailbox.pass_(password)  # 使用 pass_ 來避免與 Python 關鍵字 pass 衝突

2. 獲取郵箱信息:

獲取郵箱中的郵件數量。


num_messages = len(mailbox.list()[1])
print(f"郵件數量: {num_messages}")

3. 下載和閱讀郵件:

下載並閱讀最後一封郵件。


# 範例:讀取最後一封郵件
if num_messages > 0:
    response, lines, octets = mailbox.retr(num_messages)
    message = '\n'.join(line.decode('utf-8') for line in lines)
    print("最後一封郵件的內容:")
    print(message)

有一個專門用於解析和顯示內容的庫——email。它可以解碼郵件的內容,附件,包含標題和郵件正文。

以下是我們的郵件客戶端的最終版本。


import poplib

# 登錄憑證
username = 'your_email@example.com'
password = 'your_password'
            
# 連接到 Gmail 郵件伺服器
pop3_server = 'pop.gmail.com'
mailbox = poplib.POP3_SSL(pop3_server, 995)
            
# 登入郵箱
mailbox.user(username)
mailbox.pass_(password)  # 使用 pass_ 來避免與 Python 關鍵字 pass 衝突
            
# 獲取郵箱信息
num_messages = len(mailbox.list()[1])
print(f"郵件數量: {num_messages}")
            
# 範例:讀取最後一封郵件
if num_messages > 0:
    response, lines, octets = mailbox.retr(num_messages)
    message = '\n'.join(line.decode('utf-8') for line in lines)
    print("最後一封郵件的內容:")
    print(message)
            
# 關閉連接
mailbox.quit()

你可以嘗試閱讀你的郵件,只需指定正確的 POP3-伺服器。例如,上面的範例使用了 Gmail 的伺服器數據。如果你使用其他的郵件伺服器,網上很容易找到相關信息。

8.2 發送郵件

若要使用 SMTP(Simple Mail Transfer Protocol)在 Python 中發送電子郵件,可以使用內建的 smtplib 庫。這個模組提供了連接 SMTP-伺服器、身份驗證和發送郵件的功能。

發送郵件的主要步驟:

  • 連接到 SMTP-伺服器
  • 身份驗證。
  • 形成消息。
  • 發送消息。
  • 關閉連接。

1. 連接到 SMTP-伺服器

連接到 SMTP-伺服器,並使用 TLS 轉換到安全連接。


server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()  # 安全連接

2. 身份驗證:

使用帳戶信息登錄 SMTP-伺服器


server.login(username, password)

3. 形成簡單的字串格式的消息:


message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"

4. 發送消息:


server.sendmail(from_addr, to_addr, message)

5. 關閉連接:


server.quit()

看起來比上次簡單多了,令人高興。

整個代碼連同錯誤處理將是這樣的:


import smtplib

# 登錄憑證
smtp_server = 'smtp.gmail.com'
smtp_port = 587
username = 'your_email@gmail.com'
password = 'your_app_password'  # 使用應用程式密碼
            
# 發送者和接收者地址
from_addr = 'your_email@gmail.com'
to_addr = 'recipient@example.com'
            
# 郵件主題和正文
subject = '郵件主題'
body = '這是郵件的正文。'
            
# 形成字串格式的消息
message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"
            
try:
    # 連接到 SMTP-伺服器
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # 安全連接
            
    # 身份驗證
    server.login(username, password)
            
    # 發送消息
    server.sendmail(from_addr, to_addr, message)
    print("郵件成功發送!")
except Exception as e:
    print(f"發送郵件時出錯: {e}")
finally:
    # 關閉連接
    server.quit()

這裡的大部分代碼都是註釋和伺服器設置,實際上只需要 5 行就可以發送一封郵件。試試看——真的很有趣。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION