【问题标题】:400 Bad Request on Gmail API with php使用 php 对 Gmail API 的 400 错误请求
【发布时间】:2015-06-27 22:47:28
【问题描述】:

我希望我的服务器使用 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 致命错误:未捕获的异常“Google_Service_Exception”与 message '调用 GET 时出错 https://www.googleapis.com/gmail/v1/users/me/messages: (400) 不好 请求'在 C:\inetpub\wwwroot\utility\google-api-php-client\src\Google\Http\REST.php:110

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

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

【问题讨论】:

  • 你已经看到这个 SO 帖子了吗? stackoverflow.com/questions/29521049/…
  • 添加 $cred->sub 行后,刷新 OAuth2 令牌时会出现错误。由于我没有域,我只想访问我自己的 gmail 用于该项目,我应该使用类型服务帐户,还是其他?

标签: php google-oauth gmail-api


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我认为我现在所拥有的与您的建议相似。我设法让它与一个客户端 ID 类型的已安装应用程序一起工作。除了第一次,我需要单击并允许以获得刷新令牌。一旦我有了刷新令牌,剩下的就可以自动化了。
  • 我在 $sgmail->users_messages->listUsersMessages('me');它显示错误,如致命错误:未捕获的异常“Google_Service_Exception”和消息“调用 GET googleapis.com/gmail/v1/users/me/… 时出错:(400) 错误请求
猜你喜欢
  • 2023-03-31
  • 2014-09-22
  • 2016-10-20
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 2013-11-29
  • 2020-11-13
相关资源
最近更新 更多