本文展示使用Manuel Lemos開發的pop3_class進行郵件收取的完整流程:連接服務器、用戶認證、獲取郵箱統計、列出郵件、讀取首封郵件頭與正文,代碼結構清晰,適合快速集成POP3收信功能。
<html>
<head><title>POP3 Class Test</title></head>
<body>
<?php
require("pop3.php");
$user = "user";
$password = "passwd";
$apop = 0; // 0=標準認證 1=APOP認證
$pop3 = new pop3_class;
$pop3->hostname = "mail.xiaocui.com";
// 1. 建立連接
if (($error = $pop3->Open()) == "") {
echo "<pre>Connected to POP3 server \"{$pop3->hostname}\".</pre> ";
// 2. 用戶登入
if (($error = $pop3->Login($user, $password, $apop)) == "") {
echo "<pre>User \"$user\" logged in.</pre> ";
// 3. 獲取郵箱統計
if (($error = $pop3->Statistics($messages, $size)) == "") {
echo "<pre>There are <b>$messages</b> messages, total <b>$size</b> bytes.</pre> ";
// 4. 列出所有郵件
$result = $pop3->ListMessages("", 0);
if (is_array($result)) {
foreach ($result as $msg_num => $msg_size) {
echo "<pre>Message $msg_num - $msg_size bytes.</pre> ";
}
// 5. 讀取第一封郵件詳情
if ($messages > 0) {
if (($error = $pop3->RetrieveMessage(1, $headers, $body, -1)) == "") {
echo "<pre>Message 1: ---Headers start---</pre> ";
foreach ($headers as $line) {
echo "<pre>" . htmlspecialchars($line) . "</pre> ";
}
echo "<pre>---Headers end--- ---Body start---</pre> ";
foreach ($body as $line) {
echo "<pre>" . htmlspecialchars($line) . "</pre> ";
}
} else {
echo "Retrieve error: $error";
}
}
}
} else {
echo "Statistics error: $error";
}
} else {
echo "Login error: $error";
}
} else {
echo "Connection error: $error";
}
$pop3->Close();
?>
</body>
</html>
| 方法 | 參數 | 成功返回 | 失敗返回 |
|---|---|---|---|
Open() | 無 | 空字符串 "" | 錯誤信息字符串 |
Login($user,$pass,$apop) | 用戶名、密碼、APOP標誌 | 空字符串 | 錯誤信息 |
Statistics(&$messages,&$size) | 引用參數:郵件數、總大小 | 空字符串 | 錯誤信息 |
ListMessages($pattern,$start) | 匹配模式、起始位置 | 關聯數組 [msg_num=>size] | 錯誤信息/false |
RetrieveMessage($num,&$headers,&$body,$lines) | 郵件序號、引用頭/體、行數限制 | 空字符串 | 錯誤信息 |
Close() | 無 | 無 | 無 |
設置$pop3->debug = true可輸出完整POP3協議交互:
S: +OK POP3 server ready
C: USER user
S: +OK User name accepted
C: PASS passwd
S: +OK Mailbox open, 5 messages
C: STAT
S: +OK 5 12456
C: LIST
S: +OK 5 messages
S: 1 4021
S: 2 3872
...
C: RETR 1
S: +OK 4021 octets
S: From: sender@example.com
S: Subject: Test
S: ...
C: QUIT
S: +OK Sayonara
此可視化輸出對排查「認證失敗、網絡超時、郵件截斷、編碼亂碼」等問題極具價值。
| 局限 | 現代解決方案 |
|---|---|
| 無SSL/TLS支持(僅明文110端口) | 使用stream_socket_client + STREAM_CRYPTO_METHOD_TLS_CLIENT 或 PHP imap_open 支持995/STARTTLS |
| 無MIME解析(頭/體為原始行數組) | mailparse擴展 / php-mime-mail-parser / Symfony Mime 組件 |
| 無附件處理能力 | 上述MIME解析庫自動提取附件、內嵌圖片 |
| 錯誤處理依賴返回值 | 現代庫拋出異常,支持try-catch結構化處理 |
| APOP認證實現可能不完整 | 現代服務器多要求OAuth2/XOAUTH2 |
POP3類,支持SSL/TLS、APOP、CRAM-MD5、XOAUTH2imap_* 擴展:功能最全(IMAP/POP3/NNTP),需編譯--with-imap --with-imap-ssl --with-kerberos// 使用 PHPMailer POP3
use PHPMailer\PHPMailer\POP3;
$pop = new POP3();
$pop->doDebug = 2;
$pop->Host = 'mail.example.com';
$pop->Port = 995;
$pop->SMTPSecure = 'ssl';
$pop->Username = 'user';
$pop->Password = 'pass';
if ($pop->connect()) {
$count = $pop->Count();
for ($i = 1; $i <= $count; $i++) {
$headers = $pop->Headers($i);
$body = $pop->Body($i);
// 使用 php-mime-mail-parser 解析
}
$pop->disconnect();
}
Manuel Lemos的POP3類是PHP早期網絡編程的經典作品,展示了協議層面的精細實現。現代開發應優先選擇維護活躍、支持加密傳輸、內建MIME解析的成熟庫,將精力集中在業務邏輯而非協議細節上。