使用php在Gmail API上使用400错误请求

时间:2015-04-21 00:48:21

标签: php google-oauth gmail-api

我希望我的服务器使用php代码访问gmail帐户。以下是我用在网上找到的例子创建的内容。

<?php

session_start();

require_once dirname(dirname(__FILE__)) . '/utility/google-api-php-client/src/Google/autoload.php';

$json_file_location = 'Gmail-YQXB-7c754a18211a.json';

$client = new Google_Client();
$service = new Google_Service_Books($client);
$sgmail = new Google_Service_Gmail($client);

$scopes = array('https://www.googleapis.com/auth/books', 'https://mail.google.com');

if (isset($_SESSION['service_token'])) {
    $client->setAccessToken($_SESSION['service_token']);
}

$cred = $client->loadServiceAccountJson($json_file_location, $scopes);
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
    $client->getAuth()->refreshTokenWithAssertion($cred);
}

$_SESSION['service_token'] = $client->getAccessToken();

$optParams = array('filter' => 'free-ebooks');
$results = $service->volumes->listVolumes('Henry David Thoreau', $optParams);
echo "<h3>Results Of Call:</h3>";
foreach ($results as $item) {
    echo $item['volumeInfo']['title'], "<br /> \r\n";
}

$msg = $sgmail->users_messages->listUsersMessages('me');
var_dump($msg); 

?>

代码的工作原理除了最后一个请求,它会抛出类似的东西:

  

PHP致命错误:未捕获的异常&#39; Google_Service_Exception&#39;同   消息&#39;调用GET时出错   https://www.googleapis.com/gmail/v1/users/me/messages :( 400)糟糕   请求&#39;在   C:\的Inetpub \ wwwroot的\效用\谷歌-API-PHP-客户\ SRC \谷歌\ HTTP \ REST.php:110

$msg = $sgmail->users_messages->listUsersMessages('me');

此帐户是服务帐户。如果我使用Web应用程序类型的客户端ID,我可以使它工作。只是不知道这里有什么问题。

1 个答案:

答案 0 :(得分:1)

如果您只想访问一个帐户(您自己的帐户),则不应使用服务帐户。服务帐户是他们自己的帐户,他们不是Gmail帐户。它们适用于不需要用户的API(例如地图,搜索),或者当您使用Google Apps for Work域并希望为域中的所有用户启用委派时(通过域管理员,所以您不要&# 39;需要个人用户授权)。

您想使用标准的oauth2网络身份验证流程。如果您想确保它可以脱机使用(例如通过某些脚本/服务/ cron作业),请确保在oauth2授权Web流程请求中添加脱机标记,并确保获得永久刷新令牌(可用于请求访问令牌)。如果您没有设置离线,那么它只是一小时的访问令牌。有关详细信息,请参阅https://developers.google.com/gmail/api/auth/web-server