使用以下代码尝试列出我刚设置的全新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访问权限:
500让我相信这是gmail API的内部错误,或者我错过了PHP客户端无法验证的内容。
答案 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');
上找到完整说明