本文示範如何使用 PHP cURL 模擬瀏覽器行為,完成 163 郵箱的登入驗證、郵件發送與通訊錄抓取。透過 Cookie 檔案持久化會話狀態,並處理登入後的重導向與表單提交流程。
<div id="eHint">),失敗時刪除 Cookie 並中止。<?php
header("Content-Type: text/html; charset=UTF-8");
error_reporting(0);
/**
* 模擬登入 163 郵箱
* @param string $user 帳號
* @param string $pass 密碼
* @return string|false Cookie 檔案路徑,失敗回傳 false
*/
function login($user, $pass)
{
$url = 'https://reg.163.com/logins.jsp?type=1&url=https://entry.mail.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1';
$cookieFile = tempnam(sys_get_temp_dir(), 'mail163_');
$fields = [
'username' => $user,
'password' => $pass,
'verifycookie' => 1,
'style' => -1,
'product' => 'mail163',
'selType' => -1,
'secure' => 'on'
];
$postData = http_build_query($fields);
$headers = [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer: https://www.163.com'
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $postData,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false, // 僅示範,生產請驗證憑證
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// 檢查登入錯誤訊息
if (preg_match('/<div class="info" id="eHint">(.*?)<\/div>/is', $response, $m)) {
@unlink($cookieFile);
return false; // 或拋出例外
}
// 登入成功,將 Cookie 檔路徑存入快取供後續使用
file_put_contents(sys_get_temp_dir() . '/mail163_cookie_path', $cookieFile);
return $cookieFile;
}
/**
* 通用 cURL 請求(攜帶 Cookie)
* @param array $data ['url','data_post?','cookie']
* @return string 回應內容
*/
function curlRequest(array $data)
{
$url = $data['url'];
$postData = $data['data_post'] ?? false;
$cookieFile = $data['cookie'];
$headers = [
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer: https://www.163.com'
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HEADER => true,
CURLOPT_CONNECTTIMEOUT => 30,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_COOKIEFILE => $cookieFile,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_SSL_VERIFYPEER => false,
]);
if ($postData) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
}
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
// --- 使用範例 ---
$cookie = login('your_account', 'your_password');
if ($cookie) {
// 發送郵件、抓取通訊錄等後續操作
// $resp = curlRequest(['url' => '...', 'cookie' => $cookie, 'data_post' => '...']);
echo "登入成功,Cookie 儲存於:$cookie";
} else {
echo "登入失敗,請檢查帳密或網路";
}
?>
tempnam() 建立唯一暫存檔,配合 CURLOPT_COOKIEJAR(寫入)與 CURLOPT_COOKIEFILE(讀取)維持會話。http_build_query() 自動處理 URL 編碼,避免手動拼接錯誤。#eHint 區塊,精準判斷登入失敗原因。本程式碼僅供學習 HTTP 協定、cURL 操作與會話管理之教學用途。嚴禁 用於:
實務開發中,請優先使用官方提供的 OAuth / API(如 163 郵箱開放平台),以合法、穩定、安全的方式整合郵件功能。
GuzzleHttp\Client 或 symfony/http-client 取代原生 cURL,程式碼更易維護。PSR-7 標準請求/回應物件,便於單元測試與中介軟體擴充。