不依賴 JavaMail 高層 API,直接操作 Socket 與 POP3 協議指令(USER, PASS, STAT, RETR, QUIT),是理解郵件接收底層機制的最佳途徑。本例展示一個極簡 POP3 客戶端,手動完成 TCP 連線、認證握手、狀態查詢、郵件檢索與連線關閉全流程。
S: +OK POP3 server ready // 伺服器歡迎訊息
C: USER username // 發送用戶名
S: +OK User name accepted
C: PASS password // 發送密碼
S: +OK Mailbox open
C: STAT // 查詢郵件數量與總大小
S: +OK 5 123456
C: RETR 1 // 檢索第 1 封郵件
S: +OK 1234 octets
S: [郵件原始內容...]
S: . // 單獨一行 "." 表示結束
C: QUIT // 登出
S: +OK Sayonara
Socket client = new Socket(POP3Server, 110);
BufferedReader sockin = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter sockout = new PrintWriter(client.getOutputStream(), true); // auto-flush
// 握手
System.out.println("S:" + sockin.readLine());
sockout.println("user " + popUser);
System.out.println("S:" + sockin.readLine());
sockout.println("pass " + popPassword);
System.out.println("S:" + sockin.readLine());
// 狀態與檢索
sockout.println("stat");
String reply = sockin.readLine();
sockout.println("retr 1");
// 讀取郵件內容直到單獨的 "."
if (reply.startsWith("+OK")) {
do {
reply = sockin.readLine();
System.out.println("S:" + reply);
if (reply != null && reply.length() > 0 && reply.charAt(0) == '.') break;
} while (true);
}
sockout.println("quit");
PrintWriter(true) 自動 flush 並發送換行,BufferedReader.readLine() 完美匹配。+OK 表示成功,-ERR 表示失敗。程式碼僅簡單檢查首字元 '+',生產環境需完整解析。RETR 回應內容以單獨一行 . 結束(若內容含單獨 . 行,伺服器會轉義為 ..,客戶端需反轉義),本例簡化處理。finally 區塊確保 socket.close(),避免連線洩漏。傳統 POP3 (Port 110) 明文傳輸帳密與郵件內容,極不安全。實際部署必須使用 POP3S (Port 995, SSL/TLS) 或 STARTTLS 升級加密。Java 中可用 SSLSocketFactory 建立加密 Socket,其餘指令流程完全一致。