8.1 讀取郵件
我覺得我們已經對網路的基本操作有了足夠的了解。讓我們來做些更有趣的事吧——網路中有這麼多有趣的東西。怎麼樣來讀取和發送郵件呢?
電子郵件出現已有 50 年了,比第一個瀏覽器早了 20 年。那時候人們使用特別的程式來發送郵件。這對我們意味著什麼呢?就是說這個郵件工作標準(協議)簡單得不得了。
協議 POP3(Post Office Protocol version 3)用於從郵件伺服器獲取電子郵件。與 IMAP 不同,POP3 通常會把郵件下載到 本地電腦並從伺服器上刪除。在 Python 中,可以使用 poplib 庫來操作 POP3。
注意: 與 POP3 不同的是,IMAP(Internet Message Access Protocol)可以在伺服器上存儲郵件並在設備之間同步狀態。如果你從多個設備讀取郵件,IMAP 更方便,而 POP3 更適合在單一設備上本地存儲郵件。
獲取郵件列表的主要步驟:
- 連接到郵件伺服器。
- 身份驗證。
- 獲取郵件列表。
- 下載和閱讀郵件。
- 從伺服器斷開連接。
要編寫第一個應用程式,我們需要兩個庫:poplib 和 email。如果你還沒有它們,請安裝。如何使用 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 行就可以發送一封郵件。試試看——真的很有趣。
GO TO FULL VERSION