无法listUserMessages() - 500后端错误

时间:2014-10-06 17:15:06

标签: php google-api-php-client gmail-api

使用以下代码尝试列出我刚设置的全新Gmail帐户收到的邮件时,我

  

[Google_Service_Exception] Error calling GET https://www.googleapis.com/gmail/v1/users/myGmailAccount%40gmail.com/messages: (500) Backend Error

我知道验证部分工作正常,因为我能够进行微小修改并查询图书api,如this example所示。以下是我用来尝试查询收到的最近消息的代码......

const EMAIL = 'myGmailAccount@gmail.com';

private $permissions = [
    'https://www.googleapis.com/auth/gmail.readonly'
];

private $serviceAccount = 'xxxxxxxxxxxxxxxxx@developer.gserviceaccount.com';

/** @var Google_Service_Gmail */
private $gmail = null;

/** @var null|string */
private static $serviceToken = null;

public function __construct()
{
    $client = new Google_Client();
    $client->setApplicationName($this->applicationName);
    $this->gmail = new Google_Service_Gmail($client);

    //authentication
    if (isset(self::$serviceToken)) {
        $client->setAccessToken(self::$serviceToken);
    }

    $credentials = new Google_Auth_AssertionCredentials(
        $this->serviceAccount,
        $this->permissions,
        $this->getKey()
    );
    $client->setAssertionCredentials($credentials);
    if($client->getAuth()->isAccessTokenExpired()) {
        $client->getAuth()->refreshTokenWithAssertion($credentials);
    }
    self::$serviceToken = $client->getAccessToken();
}

public function getMessages()
{
    $this->gmail->users_messages->listUsersMessages(self::EMAIL);
}

我已授予对gmail的API访问权限:  enter image description here

500让我相信这是gmail API的内部错误,或者我错过了PHP客户端无法验证的内容。

3 个答案:

答案 0 :(得分:2)

这个对我有用。我的理解是服务帐户没有邮箱,并且不太确定应该使用哪个邮箱。所以你不能使用listUsersMessages()函数来获取所有消息。

因此,您需要指定服务帐户需要使用的电子邮件地址。

确保Web App API上允许使用范围

<强> 1。添加以下行:

$credentials->sub = self::EMAIL;

在:

$client->setAssertionCredentials($credentials);

<强> 2。然后将getMessages()更新为:

$this->gmail->users_messages->listUsersMessages("me");

希望这有帮助!

答案 1 :(得分:0)

我想这个帐户已经登录到网络界面了,对吧?您是否尝试过单独的用户?如何做一些像标签列表呢?您是否尝试使用API​​资源管理器网站? https://developers.google.com/apis-explorer/#p/gmail/v1/

你能提供开发者客户ID的前5位数(不管怎么说都不是秘密)所以我可以尝试追踪错误吗?

答案 2 :(得分:0)

要使其正常工作,您必须模拟用户帐户(该服务帐户没有邮箱,因为 lthh89vt 指出)。

如果您尝试直接访问邮箱,则会收到(500) Back End错误。

完整的代码是:

$client_email = '1234567890-a1b2c3d4e5f6g7h8i@developer.gserviceaccount.com';
$private_key = file_get_contents('MyProject.p12');
$scopes = array('https://www.googleapis.com/auth/gmail.readonly');

$user_to_impersonate = 'user@example.org';
$credentials = new Google_Auth_AssertionCredentials(
    $client_email,
    $scopes,
    $private_key,
    'notasecret',                                 // Default P12 password
    'http://oauth.net/grant_type/jwt/1.0/bearer', // Default grant type
    $user_to_impersonate,
);

$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
    $client->getAuth()->refreshTokenWithAssertion();
}

$service = new Google_Service_Gmail($client);
$results = $service->users_messages->listUsersMessages('me');

可在Google APIs Client Library for PHP

上找到完整说明