首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 模擬登入 163 郵箱:發送郵件與抓取通訊錄完整實作

     編輯:PHP 綜合知識

本文示範如何使用 PHP cURL 模擬瀏覽器行為,完成 163 郵箱的登入驗證、郵件發送與通訊錄抓取。透過 Cookie 檔案持久化會話狀態,並處理登入後的重導向與表單提交流程。

核心架構

  • login():向 163 登入端點 POST 帳密,取得並儲存 Cookie 到暫存檔。
  • curl():通用 HTTP 請求封裝,自動攜帶 Cookie 檔案,支援 GET/POST 與自訂 Header。
  • 錯誤處理:解析回應頁面中的錯誤訊息(<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 "登入失敗,請檢查帳密或網路";
}
?>

關鍵技術細節

  1. Cookie 持久化:使用 tempnam() 建立唯一暫存檔,配合 CURLOPT_COOKIEJAR(寫入)與 CURLOPT_COOKIEFILE(讀取)維持會話。
  2. 表單編碼:採用 http_build_query() 自動處理 URL 編碼,避免手動拼接錯誤。
  3. User-Agent 偽裝:模擬主流瀏覽器 UA,降低被風控攔截機率。
  4. 錯誤頁面解析:透過正則擷取 #eHint 區塊,精準判斷登入失敗原因。

⚠️ 法律與道德提醒

本程式碼僅供學習 HTTP 協定、cURL 操作與會話管理之教學用途。嚴禁 用於:

  • 未經授權批量登入他人帳號
  • 垃圾郵件發送或通訊錄濫用
  • 任何違反《網安法》、《個資法》或 163 服務條款的行為

實務開發中,請優先使用官方提供的 OAuth / API(如 163 郵箱開放平台),以合法、穩定、安全的方式整合郵件功能。

現代化改良建議

  • 改用 GuzzleHttp\Client 或 symfony/http-client 取代原生 cURL,程式碼更易維護。
  • 引入 PSR-7 標準請求/回應物件,便於單元測試與中介軟體擴充。
  • 加入 重試機制(Exponential Backoff)與 熔斷器,提升穩定性。
  • 將 Cookie 改存 Redis / Database,支援分散式部署與多伺服器共享會話。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved