Моя цель — обновить подпись электронной почты всех пользователей с моего домена.
Я создал служебную учетную запись с полномочиями делегирования на уровне домена.
Но я застрял с этой ошибкой:
{
"error": {
"errors": [
{\n
"domain": "global",
"reason": "failedPrecondition",
"message": "Bad Request"}
],
"code": 400,
"message": "Bad Request"}
}
Я использую тот же запрос, что и тот, который был выполнен в проводнике API. Так что должно быть хорошо отформатировано …
В проводнике API он тоже не работает должным образом, у меня есть такой ответ:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "forbidden",
"message": "Delegation denied for [email protected]"}
],
"code": 403,
"message": "Delegation denied for [email protected]"}
}
Кажется, у меня проблемы с разрешением, но я не могу понять, почему.
Вот мой код теста PHP для информации:
public function updateSignAction(){
putenv('GOOGLE_APPLICATION_CREDENTIALS='.$this->get('kernel')->getRootDir().'/../app/Resources/files/mydomain.json');
$client = new \Google_Client();
$client->useApplicationDefaultCredentials();
$client->setApplicationName("demo");
$client->addScope([
"https://www.googleapis.com/auth/gmail.settings.basic",
"https://www.googleapis.com/auth/gmail.settings.sharing"]);
//$client->setSubject('[email protected]');
$httpClient = $client->authorize();
$response = $httpClient->put(
'https://www.googleapis.com/gmail/v1/users/[email protected]/settings/sendAs/test',
[
'json' => [
'signature' => "test-via-api"]
]
);
return $this->render('AdminBundle:GoogleApi:user/update.html.twig', array(
'response' => $response->getBody()->getContents(),
));
}
Вы должны пройти аутентификацию в API. Для этого есть два способа:
Итак, в настоящее время вы пытаетесь отправить почту с учетной записи службы, но это не учетная запись Gmail.
Обратите внимание: с обычными учетными записями GMail вы не можете использовать «служебные учетные записи». Вам придется использовать OAuth. Чтобы использовать учетные записи служб, вы должны быть клиентом Служб Google.
Чтобы предоставить вашей учетной записи службы разрешения на отправку писем от имени ваших учетных записей GMails / Google Apps, выполните следующие действия. этот документ. Для одной или нескольких областей API вам нужно будет ввести https://mail.google.com/,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.compose,https://www.googleapis.com/auth/gmail.send
,
После настройки можно отправлять письма, просто изменив код следующим образом:
$results = $service->users_messages->send("me", $msg);
не будет работать, потому что «я» ссылается на учетную запись службы, которая не может отправлять почту (см. выше). замещать me
с идентификатором пользователя (почтовым адресом) учетной записи, с которой следует отправлять почту .:
$results = $service->users_messages->send("[email protected]", $msg);
Затем вам нужно будет добавить
$cred->sub = '[email protected]';
below
$cred = new \Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/gmail.send', 'https://www.googleapis.com/auth/gmail.compose'),
$key
);
<?php
require_once realpath(dirname(__FILE__) . '/../src/Google/autoload.php');
$client_id = '*censored*.apps.googleusercontent.com';
$service_account_name = '*censored*@developer.gserviceaccount.com';
$key_file_location = '/tmp/apiKey.p12';
$userid_from='*censored*';
$client = new \Google_Client();
$client->setApplicationName("Client_Library_Examples");
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new \Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/gmail.send', 'https://www.googleapis.com/auth/gmail.compose', 'https://www.googleapis.com/auth/gmail.modify','https://www.googleapis.com/auth/gmail.readonly'),
$key
);
$cred->sub=$userid_from;
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$mime = "*censored*";
$service = new \Google_Service_Gmail($client);
$msg = new \Google_Service_Gmail_Message();
$msg->setRaw($mime);
try {
$results = $service->users_messages->send($userid_from, $msg);
print 'Message with ID: ' . $results->id . ' sent.';
} catch (\Exception $e) {
print 'An error occurred: ' . $e->getMessage();
}
Если остались какие-либо вопросы, не стесняйтесь задавать!
Других решений пока нет …