Gmail API 和 php 上的 400 错误请求
400 Bad Request on Gmail API with php
我希望我的服务器使用 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 Fatal error: Uncaught exception 'Google_Service_Exception' with
message 'Error calling GET
https://www.googleapis.com/gmail/v1/users/me/messages: (400) Bad
Request' in
C:\inetpub\wwwroot\utility\google-api-php-client\src\Google\Http\REST.php:110
$msg = $sgmail->users_messages->listUsersMessages('me');
此帐户是一个服务帐户。如果我使用 Web 应用程序类型的客户端 ID,我可以让它工作。只是不知道这里出了什么问题。
如果您只想访问一个帐户(您自己的),则不应使用服务帐户。服务帐户是他们自己的帐户,而不是 Gmail 帐户。它们适用于不需要用户的 API(例如地图、搜索),或者当您使用 Google Apps for Work 域并希望为域中的所有用户启用委派时(由域管理员,因此您不需要个人用户授权)。
您想使用标准的 oauth2 网络身份验证流程。如果你想确保它可以离线使用(例如通过一些 script/service/cron 工作)然后确保你在你的 oauth2 授权网络流请求中添加离线标志,这将确保你获得永久刷新令牌(可以是用于请求访问令牌)。如果您不设置离线,那么它是一个只能使用一个小时的访问令牌。有关详细信息,请参阅 https://developers.google.com/gmail/api/auth/web-server。
我希望我的服务器使用 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 Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling GET https://www.googleapis.com/gmail/v1/users/me/messages: (400) Bad Request' in C:\inetpub\wwwroot\utility\google-api-php-client\src\Google\Http\REST.php:110
$msg = $sgmail->users_messages->listUsersMessages('me');
此帐户是一个服务帐户。如果我使用 Web 应用程序类型的客户端 ID,我可以让它工作。只是不知道这里出了什么问题。
如果您只想访问一个帐户(您自己的),则不应使用服务帐户。服务帐户是他们自己的帐户,而不是 Gmail 帐户。它们适用于不需要用户的 API(例如地图、搜索),或者当您使用 Google Apps for Work 域并希望为域中的所有用户启用委派时(由域管理员,因此您不需要个人用户授权)。
您想使用标准的 oauth2 网络身份验证流程。如果你想确保它可以离线使用(例如通过一些 script/service/cron 工作)然后确保你在你的 oauth2 授权网络流请求中添加离线标志,这将确保你获得永久刷新令牌(可以是用于请求访问令牌)。如果您不设置离线,那么它是一个只能使用一个小时的访问令牌。有关详细信息,请参阅 https://developers.google.com/gmail/api/auth/web-server。