初识Gmail API(PHP)

PHP, 代码片段 2018/08/29

有时候想要及时获取Gmail的最新邮件,但是如果没有合适的上网环境,这就难搞了,毕竟国内上谷歌还是有些难度的。

所以就想到可以利用PHP+Google API的方式简单获知Gmail的邮件。

准备工作

PHP版本>5.4,并且开启了cli和json扩展(一般都默认开启了,比如宝塔、LNMP)

Composer依赖管理工具(本文以CentOS 7 为例,可以直接yum安装)

启用了Gmail的Google帐户

一、打开Gmail API开关

https://developers.google.com/gmail/api/quickstart/php

1.点击Enable the Gmail API

2.创建项目(Project),填写项目名称

任意填

3.获取Client ID和Client Secret

点击按钮下载用户凭据配置文件,注意:妥善保存这两项关键信息

二、部署Google Client Library

1.安装composer部署工具

yum install composer -y

2.SSH登录网站根目录

比如 /www/wwwrooot/mygmailapi.com/

cd /www/wwwrooot/mygmailapi.com/
composer require google/apiclient:^2.0

3.上传示例代码和之前保存的用户凭据配置文件

Gmail API给出了一个简单的示例文件:https://github.com/gsuitedevs/php-samples/blob/master/gmail/quickstart/quickstart.php

直接下载该示例代码(quickstart.php),然后连同第一步中获取到的用户凭据配置文件(credentials.json),上传到服务器上一步执行composer的目录。

三、测试

为了保证安全性,Gmail API提供的示例代码加入了php_sapi_name,也就是运行环境的检测

只能在cli环境(commandline,命令行)下调试,不允许在Web环境下测试

所以我们可以先在SSH中通过php单独执行这个示例代码,确定可以部署到生产环境后再删除其sapi检测。

SSH下执行

cd /www/wwwrooot/mygmailapi.com/
php -f quickstart.php

复制认证链接到浏览器中打开,登录Google账号后会获得Token,将Token复制并粘贴回SSH窗口

此时再次执行php -f quickstart.php,即可看得Gmail的邮箱Label

四、写代码

上述步骤只是测试通过php获取邮箱里的Lable(标签),现在就开始写代码,获取邮箱的其他信息,比如未读邮件列表

可以利用Gmail自带的邮箱过滤器,将收件箱的未读邮件筛选出来,对应的筛选参数为:is:unread label:inbox

如果需要筛选出所有的未读邮件(包含垃圾箱),只需去掉label:inbox即可,如:is:unread

核心部分:

获取标题:

$opt_param = array();
//筛选参数
$opt_param['q'] = "is:unread label:inbox ";
$opt_param['maxResults'] = 10;

$results = $service->users_messages->listUsersMessages("me", $opt_param);
foreach($results as $mail){
	$message = $service->users_messages->get("me", $mail['id']);
	$headers = $message->getPayload()->getHeaders();
	$subject = getHeader($headers, 'Subject');
	echo $subject.'\r\n';
}

获取摘要:

$opt_param = array();
//筛选参数
$opt_param['q'] = "is:unread label:inbox ";
$opt_param['maxResults'] = 10;
$threads = $service->users_threads->listUsersThreads("me", $opt_param);
foreach ($threads as $thread) {
	echo $thread->getSnippet() . '\r\n';
}

完整代码:

https://file.bugxia.com/s/QF7SrGCJmpytjxG

效果:

SSH下执行

#获取邮件标题
php -f getGmail.php title
#获取邮件摘要
php -f getGmail.php snippet

如果删除代码中的sapi检测,则可以通过Web进行访问



2条评论

  • 小透明 评论于 回复

    你好,我将浏览器返回的code键入命令行时提示如下错误,请问要如何解决这个问题

    PHP Fatal error: Uncaught exception ‘GuzzleHttp\Exception\ConnectException’ wit
    h message ‘cURL error 7: Failed to connect to oauth2.googleapis.com port 443: Ti
    med out (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)’ in E:\xampp\ht
    docs\gmail_api\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php:200

    • www.zktek.com 评论于 回复

      @小透明
      这个问题我也遇到了:我用阿里云华南的ESC独立服务器也是一样的错误。 但是在香港的服务器就运行的很顺利。 估计是GFW的问题,建议服务器需要配置学术科学上网, 如果能解决欢迎交流。

    评论(本站已开启评论回复邮件通知功能,请如实填写邮箱以便及时收到回复)