PHP使用CURL模拟登录Gmail、Hotmail及Yahoo获取邮箱通讯录

程一诺
程一诺
发布时间:2026-10-14| 4人浏览过
原创

在开发邮件同步或通知工具时,获取邮箱通讯录是一个常见需求。由于各大邮箱平台多采用AJAX和复杂的鉴权机制,直接调用标准接口往往受限。本文将详细说明如何使用PHP的CURL库,模拟浏览器行为完成Gmail、Hotmail和Yahoo的自动登录流程,并提取JSON格式的联系人数据。

核心原理与技术准备

模拟登录的核心逻辑分为三个阶段:首先抓取登录页以获取Session Cookie和动态令牌(如CSRF Token);其次构造包含用户名、密码及令名的POST请求进行身份验证;最后在登录成功后访问通讯录接口,解析返回的结构化数据。所有操作依赖 CURLOPT_COOKIEJAR 和 CURLOPT_COOKIEFILE 来维持会话状态,并确保SSL验证设置为关闭以避免因证书问题导致的连接失败。

以下提供的代码主要用于演示技术原理。实际部署时需注意账号的安全风险,建议仅用于授权测试或非敏感场景。现代互联网服务频繁更新反爬策略,旧版API可能已失效,使用时请做好容错处理。

第一步:实现Gmail通讯录获取功能

1. 初始化登录环境

Gmail登录需要处理隐藏的表单域。我们首先定义Cookie存储路径和超时参数,利用CURL初始化一个会话来获取登录页面的源码。

<?php
define("COOKIEJAR", tempnam(ini_get("upload_tmp_dir"), "cookie"));
define("TIMEOUT", 1000);

class GMAIL {
    private function login($username, $password) {
        // 1. 获取登录页面及初始Cookie
        $login_url = "https://www.google.com/accounts/ServiceLoginAuth";
        $ch = curl_init($login_url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $contents = curl_exec($ch);
        curl_close($ch);?

2. 解析并提交登录凭证

通过正则表达式从页面源码中提取动态生成的隐藏字段(如 dsh, timeStmp, GALX 等)。随后组装POST数据,再次发起请求完成认证。注意检查响应中是否包含“安全退出”字样来判断登录是否成功。

        // 2. 提取隐藏字段
        $name = array('dsh','timeStmp','secTok');
        foreach($name as $v) {
            preg_match('/<input.*?type="hidden".*?name="' .$v.'".*?value="(.*?)".*?/>/i', $contents, $matches);
            if(!empty($matches)) $$v = $matches[1];
        }
        
        // 提取 GALX
        preg_match('/<input.*?type="hidden".*?name="GALX".*?value="(.*?)".*?/>/i', $contents, $matches);
        if(!empty($matches)) $GALX = $matches[1];
        
        $timeStmp = time();
        
        // 3. 提交登录表单
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $login_url);
        curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
        curl_setopt($ch, CURLOPT_POST, 1);
        $fields = "dsh=$dsh&Email=".$username."&Passwd={$password}&GALX=$GALX&timeStmp=$timeStmp&secTok=$secTok";
        curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
        curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
        curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
        curl_exec($ch);
        curl_close($ch);
}

3. 提取通讯录数据

登录成功后,访问Gmail的地址簿接口。该接口支持 out=js 参数返回JSON格式数据。返回内容通常包裹在特定的前后缀字符串中,需截取中间有效部分即可使用。

    public function getAddressList($username, $password) {
        if (!$this->login($username, $password)) return FALSE;
        
        $ch = curl_init();
        // 设置 out=js 获取 JSON 数据
        $url = "http://mail.google.com/mail/contacts/data/contacts?thumb=true&out=js&max=300";
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
        curl_setopt($ch, CURLOPT_TIMEOUT, TIMEOUT);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $contents = curl_exec($ch);
        curl_close($ch);
        
        // 清理返回数据的前后缀
        $contents = substr($contents, strlen('while (true); &&&&START&&&&'), -strlen('&&&&END&&&& '));
        return $contents;
    }
}

第二步:实现Hotmail (MSN) 登录与读取

Hotmail使用不同的身份验证流程(Live ID),涉及 PPFT 和 PPSX 令牌。其联系人数据通常隐藏在JS变量或特定HTML结构中。

1. Hotmail登录流程

首先进入登录入口获取初始页面,提取关键令牌。然后拼接包含登录信息的POST数据包,发送到 ppsecure/post.srf 端点进行验证。如果响应中包含 WLWorkflow,则代表登录失败。

cass MSN {
    function getAddressList($username, $password) {
        // 1. 获取初始页面
        $ch = curl_init();
        $url = "http://login.live.com/login.srf?..."; // 此处省略详细URL参数
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIEJAR);
        $str = curl_exec($ch); curl_close($ch);
        
        // 2. 提取 PPFT 和 PPSX
        preg_match('/<input.*?name="PPFT".*?value="(.*?)".*?/>/i', $str, $matches);
        $PPFT = $matches[1];
        
        // ... 其他参数处理 ...
        
        // 3. 提交登录信息
        $postfiles = "login=".$username."&passwd=".$password."&PPFT=$PPFT...";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://login.live.com/ppsecure/post.srf...");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postfiles);
        curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIEJAR);
        $content = curl_exec($ch); curl_close($ch);
        
        if(stripos($content, 'WLWorkflow') !== FALSE) return false;
    }
}

2. 解析联系人

成功登录后,需要通过重定向链进入主面板。最终访问 ContactMainLight.aspx 页面,解析其中的 ic_control_data 变量,这通常包含了JSON格式的联系人列表。

第三步:实现Yahoo邮箱登录

Yahoo的登录流程相对复杂,包含大量的隐藏输入项。它同样需要抓取页面并构建完整的POST数组。

1. Yahoo登录参数构建

Yahoo登录页包含 .persistent, .done 等大量带前缀的参数。需遍历这些字段并进行URL编码。其中 .pd 和 .pad 有特殊逻辑,.done 需要重新编码。

$name = array('.src','.intl','emailCode','pkg','stepid','hasMsgr','chkP','done','pd','pad','aad');
foreach($name as $v) {
    preg_match('/<input.*?name="'.$v.'".*?value="(.*?)".*?>/i', $contents, $matches);
    if(!empty($matches)) $postfiles[$v] = $matches[1];
}
$postfiles['login'] = urlencode($username);
$postfiles['passwd'] = $password;
// 必须设置 persistent 为 y
$postfiles['.persistent'] = 'y';

2. 提取通讯录

Yahoo的地址簿接口位于 address.mail.yahoo.com。登录后访问该页面,解析 JavaScript 中的 InitialContacts 数组变量即可获取原始数据。

以上就是使用PHP CURL模拟登录Gmail、Hotmail及Yahoo获取邮箱通讯录的详细内容,更多关于PHP邮箱集成的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。