2016-11-03 2 views
-1

Je souhaite changer tous les signatures de mon domaine Gmail. Ce domaine a beaucoup de comptes, et je dois le changer de server-side.Gmail API Signature côté serveur

J'utilise php, et j'ai commencé mon projet avec: php composer.phar nécessitent google/apiclient:2.0

j'ai écrit un code, mais lorsque je tente de mettre à jour un e-mail (comme [email protected]), Je reçois:

{ "error": { "errors": [ { "domain": "global", "reason": "insufficientPermissions", "message": "Insufficient Permission" } ], "code": 403, "message": "Insufficient Permission" } } 

Mon code (using API client library) est quelque chose comme:

<?php 

// initialize gmail 
function getService() { 
    try { 
     include_once __DIR__ . '/vendor/autoload.php'; 

     $client = new Google_Client(); 

     $credentials_file = __DIR__ . '/credentials/gmailAPI.json'; 

     // set the location manually. Credential server-side 
     $client->setAuthConfig($credentials_file); 

     $client->setApplicationName("GmailAPI"); 
     $client->setScopes(['https://apps-apis.google.com/a/feeds/emailsettings/2.0/']); 

     $gmail = new Google_Service_Gmail($client); 

     return $gmail; 
    } catch (Exception $e) { 
     throw new Exception($e->getMessage()); 
    } 
} 

function updateSignature(&$gmail) { 
    try { 
     // Start sendAs 
     $signature = new Google_Service_Gmail_SendAs(); 
     // Configure Signature 
     $signature->setSignature("Any HTML text here."); 

     // Update account and print answer 
     var_dump($gmail->users_settings_sendAs->update("[email protected]","[email protected]",$signature)); 
    } catch (Exception $e) { 
     throw new Exception($e->getMessage()); 
    } 

} 

try { 
    $gmail = getService(); 
    updateSignature($gmail); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
} 

?> 

Mon fichier de référence (g mailAPI.json) est une clé de compte de service, et j'utilise Google for Work. J'ai créé cette information d'identification à l'aide d'un compte administrateur de ce domaine.

My credential file is:

{ 
    "type": "service_account", 
    "project_id": "myProjectId", 
    "private_key_id": "myPrivateKeyid", 
    "private_key": "myPrivateKey", 
    "client_email": "[email protected]", 
    "client_id": "myId", 
    "auth_uri": "url", 
    "token_uri": "url", 
    "auth_provider_x509_cert_url": "url", 
    "client_x509_cert_url": "url" 
} 

Modifier 1

J'ai changé les champs d'application comme indiqué, et maintenant mes champs d'application sont:

$ client-> setScopes ([ 'https://www.googleapis.com/auth/gmail.settings.basic', » https://www.googleapis.com/auth/gmail.settings.sharing ']);

J'ai également ajouté permision sur Google (/ AdminHome? Chromeless = 1 # OGX: ManageOauthClients) à ma clé de compte de service.

J'ai essayé API explorer et cela fonctionne. Quand j'ai changé les portées, l'erreur a changé pour:

{"error": {"erreurs": [{"domain": "global", "raison": "failedPrecondition", "message": "Mauvaise demande "}], "code": 400, "message": "Bad Request"}}

J'utilise cette commande:

var_dump ($ gmail-> users_settings_sendAs-> mise à jour (" someEmail @ myDomain .com.br "," [email protected] ", $ signature));

J'ai essayé aussi

var_dump (gmail- $> users_settings_sendAs-> get ("[email protected]", "[email protected]"));

Mais j'ai reçu la même erreur.

Répondre

0

Merci à tous.

J'ai essayé beaucoup de codes, et finalement trouvé un qui fonctionne.

include_once __DIR__ . '/vendor/autoload.php'; 
// credential file (service account) 
$credentials_file = __DIR__ . '/credentials/gmailAPI.json'; 
putenv('GOOGLE_APPLICATION_CREDENTIALS='.$credentials_file); 
// Initialize Google Client 
$client = new Google_Client(); 
$client->useApplicationDefaultCredentials(); 
// scopes to change signature 
$client->setScopes(['https://www.googleapis.com/auth/gmail.settings.basic','https://www.googleapis.com/auth/gmail.settings.sharing']); 
// *important* -> Probably because delegated domain-wide access. 
$client->setSubject("[email protected]"); 
// Initialize Gmail 
$gmail = new Google_Service_Gmail($client); 
// set signature 
$signature = new Google_Service_Gmail_SendAs(); 
$signature->setSignature("HTML code here."); 
// update signature 
$response = $gmail->users_settings_sendAs->update("[email protected]","[email protected]",$signature)->setSignature(); 
// get signature 
$response = $gmail->users_settings_sendAs->get("[email protected]","[email protected]")->getSignature(); 
echo json_encode($response); 

Je commente tout le code, et moi https://developers.google.com/api-client-library/php/auth/service-accounts pour le créer. Atention -> Vous devez accorder une autorisation sur Gmail et créer une clé de serveur (avec un accès à l'ensemble du domaine).

0

Je pense que votre jeton d'accès ne contient pas tous les scopes que vous voulez. Essayez d'abord dans API explorer. Vérifiez les demandes d'exploration API scopes de votre part, puis ajoutez ces étendues à votre code (endroit où vous obtenez l'autorisation).

https://developers.google.com/apis-explorer

espoir cela résout votre problème

+0

Merci Januka, J'ai essayé l'explorateur d'API et cela fonctionne. J'ai changé mes étendues sur mon projet (identique à celui utilisé dans l'explorateur d'API), et l'erreur a changé. –

+0

@Andre si ma réponse est utile upvote et la marquer comme bonne réponse –

+0

S'il vous plaît n'oubliez pas de cliquer sur "Marquer comme réponse" les réponses qui ont résolu votre problème. Cela peut être bénéfique pour les autres membres de la communauté lisant ce fil. –

0

Eh bien, l'erreur 403 ou insuffisante Permission est retourné lorsque vous ne l'avez pas demandé les champs appropriés ou complets dont vous avez besoin pour accéder à l'API que vous essayez utiliser. Voici le list of scopes with description que vous pouvez utiliser avec l'API Gmail.

Pour connaître la portée que vous utilisez, vous pouvez le vérifier avec ceci:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx

Note: Vous devez inclure toute la portée que vous utilisez et faire que vous avez activé toutes les API que vous utilisez dans la console développeur. Ce Delegating domain-wide authority to the service account pourrait également aider.

Pour plus d'informations, consultez ces liés SO questions:

+0

Merci KENdi, J'ai changé mes étendues et ajouté permision à ma clé. Lorsque j'ai changé les étendues, l'erreur a également changé. –

+0

Pour l'erreur 400 de failedPrecondition, vérifiez ces SO question [API REST Gmail: 400 Bad Request + Failed Precondition] (http://stackoverflow.com/questions/29327846/gmail-rest-api-400-bad-request-failed -precondition) et [API Gmail: 400 mauvaise demande en essayant d'envoyer un email] (http://stackoverflow.com/questions/32591549/gmail-api-400-bad-request-when-trying-to-send-an -email-php-code) si cela peut vous aider. – KENdi