2014-06-27 10 views
16

Ich versuche gerade, das neue Gmail REST API zu testen.Wie kann eine Nachricht mithilfe der neuen Gmail-REST-API erfolgreich gesendet werden?

In der API Explorer ist es möglich, Anfragen mit OAuth 2.0 zu autorisieren und eine Anfrage auszuführen, d. H. Eine Nachricht zu senden.

Zuerst habe ich autorisiert. enter image description here

Ich verwende die folgenden Testdaten (und natürlich habe ich eine gültige E-Mail Adresse to):

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

Ich habe auch eine 200 OK und die folgende Ergebnis zurück, die sieht gut aus.

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

Allerdings wird die E-Mail nicht erfolgreich gesendet werden, und ich kann eine Nachricht von [email protected] im Posteingang statt finden ;: "An error occurred, your message has not been sent."

enter image description here

Fragen:
1. Hat jemand Test das erfolgreich?
2. Muss ich einen anderen Parameter hinzufügen, um das zu erreichen?



EDIT: Es gibt 2 verschiedene HTTP-Request-Methoden,

  1. der Upload-URI für Anfragen Medien hochladen und
  2. die Metadaten URI für nur Metadaten fordert

The API Explorer currently supports metadata requests only, was Klartextnachrichten ohne Anhang bedeutet, und das ist es, was ich versuche zu tun.

+0

sicher, natürlich habe ich die Anfrage zuerst autorisiert, sonst denke ich, ich würde nicht eine '200 OK' zurück ... – Taifun

+0

@Taifun bekommen, Wie haben Sie die RFC 2822 String erstellt, Gibt es keine Bibliotheken oder hart codiert es, irgendwelche Beispiele? – Sasikanth

+0

@Sasikanth Dies hängt von Ihrer bevorzugten Programmiersprache ab. [Siehe meine Antwort unten] (http://stackoverflow.com/a/244461102/1545993) Wie web-safe base64 codiert die komplette Nachricht – Taifun

Antwort

40

hab es geschafft!

nach dem RFC 2822 specification Lesen fand ich heraus, dass die vollständige Nachricht im raw Parameter übergeben werden muss, siehe das Beispiel:

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". 

So nach base64 die vollständige Nachricht codiert, in der raw Parameter übergeben ohne einen anderen Parameter zu verwenden, funktioniert es gut.

Edit 1:
Wie @Amit erwähnt, muss es sein websichere Base64 codiert, siehe auch https://code.google.com/p/stringencoders/wiki/WebSafeBase64

So das base64 alpha in ein Format zu konvertieren, das „ist web- safe“die folgenden Änderungen werden empfohlen:

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

Um nur con vert + zu und / zu _ war für mich ausreichend.

Edit 2:
die Frage der @Hjulle hier ein Beispiel zu beantworten: Sie userId und in der Anfrage Körper brauchen nur die raw Parameter. Nehmen wir an, Ihre E-Mail-Adresse ist [email protected]

Erste Base64 die vollständige Nachricht kodieren (siehe oben) eine online encoder verwenden und diese Zeichenfolge erhalten:

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h 
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92 
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh 
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4= 

Jetzt konvertieren +-- und / zu _ und Sie erhalten

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h 
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92 
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh 
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4= 

dies nun im raw Parameter der Explorer API übergeben.

+1

URL Codierung erforderlich. http://stackoverflow.com/questions/22128789/converting-string-to-web-safe-base64-format –

+0

https://gist.github.com/AkashkumarDev/20ab002e7f5785ae778e jede Idee, wo ist das Problem? – akdev

+0

@akdev für Fragen bitte starten Sie eine neue Frage statt hier zu kommentieren. Danke. – Taifun

1

Hinweis: Dies ist eine PHP-spezifische Antwort, aber ich bin sicher, dass einige von Ihnen es nützlich finden werden.

Falls Sie mit der richtigen Einrichtung der Rohdaten in PHP zu kämpfen haben, würde die Verwendung von PHPMailer die Dinge für Sie sauberer und einfacher machen.

Nachdem die Bibliothek in Ihrem Code einschließlich (wenn Sie Komponisten verwenden, fügen Sie einfach "phpmailer/phpmailer": "~ 5.2" im erfordern Abschnitt Ihrer composer.json), stellen Sie die grundlegenden Details:

$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(); 

Jetzt können Sie base64 encodieren die $ Mime, um die rohe Zeichenfolge für die Gmail-API zu erhalten. Verwenden Sie dies anstelle von simple base64_encode, um eine gültige websichere codierte Zeichenfolge zu erhalten. rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');

Verwandte Themen