web-dev-qa-db-fra.com

Comment envoyer un message avec succès en utilisant la nouvelle API Gmail REST?

J'essaie actuellement de tester la nouvelle Gmail REST.

Dans API Explorer il est possible d'autoriser les requêtes en utilisant OAuth 2.0 et d'exécuter une requête, c'est-à-dire d'envoyer un message.

J'ai d'abord autorisé. enter image description here

J'utilise les données de test suivantes (et bien sûr j'ai utilisé une adresse e-mail to valide):

{    
   "raw": "c2VuZGluZyBhIG1haWwgdXNpbmcgR21haWwgUkVTVCBBUEk=",  
   "payload": { 
     "headers": [ 
       { "name": "to",      "value": "[email protected]"   }, 
       { "name": "from",    "value": "[email protected]" }, 
       { "name": "subject", "value": "Test Gmail REST API"  } 
     ],
     "mimeType": "text/plain" 
   }
}

Je reçois également un 200 OK et le résultat suivant en arrière, ce qui semble correct.

{
  "id": "146dee391881b35b",
  "threadId": "146dee391881b35b",
}

Cependant, le courrier ne sera pas envoyé avec succès et je peux trouver un message de [email protected] dans la boîte de réception à la place ;: "An error occurred, your message has not been sent."

enter image description here

Des questions:
1. Quelqu'un a-t-il testé cela avec succès?
2. Dois-je ajouter un autre paramètre pour que cela fonctionne?



[~ # ~] modifier [~ # ~] : il existe 2 méthodes de requête HTTP différentes,

  1. l'URI de téléchargement pour les demandes de téléchargement de médias, et
  2. l'URI de métadonnées pour les demandes de métadonnées uniquement

The API Explorer currently supports metadata requests only, ce qui signifie des messages en texte brut sans pièce jointe, et c'est ce que j'essaie de faire.

24
Taifun

je l'ai!

après avoir lu la spécification RFC 2822 j'ai découvert que le message complet doit être passé dans le paramètre raw, voir l'exemple:

From: John Doe <[email protected]> 
To: Mary Smith <[email protected]> 
Subject: Saying Hello 
Date: Fri, 21 Nov 1997 09:55:06 -0600 
Message-ID: <[email protected]>

This is a message just to say hello. So, "Hello".

Ainsi, après avoir codé en base64 le message complet, en le passant dans le paramètre raw sans utiliser aucun autre paramètre, cela fonctionne très bien.

Modifier 1:
Comme @Amit l'a mentionné, il doit être codé en base64 pour le Web, voir aussi https://code.google .com/p/stringencoders/wiki/WebSafeBase64

Ainsi, pour convertir l'alpha base64 en un format "Web-safe", les modifications suivantes sont recommandées:

+ --> - (char 62, plus to dash)
/ --> _ (char 63, slash to underscore)
= --> * padding

Pour convertir uniquement + à - et /à _ me suffisait.

Édition 2:
Pour répondre à la question de @Hjulle, voici un exemple: vous n'avez besoin que du userId et dans le corps de la requête du paramètre raw. Supposons que votre adresse e-mail soit [email protected]

Tout d'abord Base64 encoder le message complet (voir ci-dessus) en utilisant un encodeur en ligne et vous obtenez cette chaîne:

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

Maintenant, convertissez + à - et /à _ et vous obtenez

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

Passez maintenant ceci dans le paramètre raw de l'explorateur d'API.

50
Taifun

Remarque: Il s'agit d'une réponse spécifique PHP, mais je suis sûr que certains d'entre vous la trouveront utile.

Au cas où vous auriez du mal à configurer correctement les données brutes dans PHP comme je l'ai fait, utiliser PHPMailer rendrait les choses plus propres et plus faciles pour vous.

Après avoir inclus la bibliothèque dans votre code (si vous utilisez composer, ajoutez simplement "phpmailer/phpmailer": "~ 5.2" dans la section require de votre composer.json), vous définissez les détails de base:

$mail = new PHPMailer();
$mail->From = 'FROM_EMAIL';
$mail->FromName = 'FROM_NAME';
$mail->addAddress('TO_EMAIL','TO_NAME');
$mail->Subject = 'EMAIL_SUBJECT';
$mail->Body = 'EMAIL_BODY';
$mail->preSend(); 
$mime = $mail->getSentMIMEMessage();

Vous pouvez maintenant coder en base64 le $ mime pour obtenir la chaîne brute de l'API Gmail. Utilisez ceci à la place du simple base64_encode, afin d'obtenir une chaîne codée sécurisée Web valide. rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');

1
trajchevska