При использовании приведенного ниже кода, чтобы попытаться перечислить сообщения, полученные от только что настроенной учетной записи Gmail, я получаю
[Google_Service_Exception] Error calling GET https://www.googleapis.com/gmail/v1/users/myGmailAccount%40gmail.com/messages: (500) Backend Error
Я знаю, что часть проверки работает правильно, потому что я могу внести незначительные изменения и запросить API книг, как показано в этот пример. Ниже приведен код, который я использую для запроса последних полученных сообщений …
const EMAIL = '[email protected]';
private $permissions = [
'https://www.googleapis.com/auth/gmail.readonly'
];
private $serviceAccount = '[email protected]';
/** @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);
}
Я предоставил API доступ к Gmail:
500 заставляет меня поверить, что это внутренняя ошибка API gmail, или я что-то упускаю из-за того, что клиент PHP не проверяет.
Эта работа для меня. Насколько я понимаю, служебная учетная запись не имеет почтового ящика, и она не слишком уверена, с каким почтовым ящиком она должна работать. Таким образом, вы не можете использовать функцию listUsersMessages (), чтобы получить все сообщения.
Поэтому вам нужно будет указать адрес электронной почты, с которым должна работать учетная запись службы.
Убедитесь, что область действия в API веб-приложения разрешена для
1. Добавьте эту строку:
$credentials->sub = self::EMAIL;
До:
$client->setAssertionCredentials($credentials);
2. Затем обновите ваш getMessages (), чтобы:
$this->gmail->users_messages->listUsersMessages("me");
Надеюсь это поможет!
Я полагаю, что учетная запись уже вошла в веб-интерфейс, верно? Вы пробовали с отдельным пользователем? Как насчет того, чтобы сделать что-то вроде списка ярлыков? Вы пытались использовать сайт API исследователей? https://developers.google.com/apis-explorer/#p/gmail/v1/
Можете ли вы предоставить первые 5 цифр идентификатора клиента разработчика (в любом случае, это не секрет), чтобы я мог попытаться отследить ошибку?
Чтобы это работало, вы должны олицетворять учетную запись пользователя (учетная запись службы не имеет почтового ящика, так как lthh89vt указывает на то).
Если вы попытаетесь получить доступ к почтовому ящику напрямую, вы получите (500) Back End
ошибка.
Полный код:
$client_email = '[email protected]';
$private_key = file_get_contents('MyProject.p12');
$scopes = array('https://www.googleapis.com/auth/gmail.readonly');
$user_to_impersonate = '[email protected]';
$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 API для PHP