在研讀 POP3/SMTP 協議規範時,我嘗試自行撰寫一個 POP3 操作類別作為 Socket 程式設計的練習。這個類別的核心邏輯相當精簡,主要運用 fsockopen 建立連線,再透過資料流的讀寫與郵件伺服器互動。雖然僅實作最核心的功能,但涵蓋了連線管理、指令發送、回應解析以及郵件基本操作(登入、列表、讀取、刪除等)。
SocketPOPClient 類別封裝了連線參數(主機、埠號、逾時、緩衝區大小)、認證資訊(信箱、密碼)、Socket 資源控制代碼、登入狀態、請求/回應緩衝區等屬性。建構子會自動驗證信箱格式、推斷預設 POP3 主機(從信箱網域取得)並發起連線。
fsockopen 建立 TCP 連線,讀取伺服器歡迎訊息(+OK 開頭),失敗時記錄錯誤碼與訊息。類別提供完整的郵件生命週期操作:
popLogin():USER/PASS 兩步驟認證popLogout():發送 QUIT 指令正常登出getMailSum():STAT 指令取得郵件總數與總大小getMailBaseList():LIST 指令取得所有郵件編號與大小列表getMailMessage():RETR 指令取得完整郵件內容getMailTopMessage():TOP 指令取得郵件前 N 行(適合預覽)getMailSessId():UIDL 指令取得郵件唯一識別碼delMail() / resetDeleMail():DELE 標記刪除、RSET 重置刪除標記<?php
class SocketPOPClient {
// ... 屬性定義 ...
public function __construct($email, $passwd, $host = '', $port = 110) { /* ... */ }
private function connectHost() { /* ... */ }
public function sendCommand($cmd) { /* ... */ }
private function getLineResponse() { /* ... */ }
private function getRespMessage($type) { /* ... */ }
public function popLogin() { /* ... */ }
public function getMailBaseList($type = 2) { /* ... */ }
public function getMailMessage($id, $type = 1) { /* ... */ }
// ... 其他方法 ...
}
// 使用範例
$client = new SocketPOPClient('user@example.com', 'password', 'pop.example.com', 110);
if ($client->popLogin()) {
print_r($client->getMailBaseList());
print_r($client->getMailMessage(1));
$client->popLogout();
}
$client->closeHost();
?>
開發過程參考了 RFC 2449 規範與開源專案 Uebimiau 的部分邏輯,但程式碼為原創實作。適合作為學習 PHP Socket 程式設計、理解 POP3 協議流程的教學範例。實際生產環境建議使用成熟函式庫(如 PHP 內建的 imap 擴充或第三方套件)以支援 SSL/TLS、更完善的錯誤處理與 MIME 解析。