2014-06-27 8 views
16

Attualmente sto provando a testare il nuovo Gmail REST API.Come inviare un messaggio correttamente utilizzando la nuova API REST di Gmail?

Nel API Explorer è possibile autorizzare richieste utilizzando OAuth 2.0 e per eseguire una richiesta, ad esempio inviare un messaggio.

Prima ho autorizzato. enter image description here

Sto utilizzando il seguente dati di test (e, naturalmente, ho usato un indirizzo email valido 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" 
    } 
} 

ho anche ottenere una 200 OK e il risultato seguente posteriore, che sembra a posto.

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

Tuttavia, la posta non verrà inviato con successo e posso trovare un messaggio dalla [email protected] nella casella di posta, invece ;: "An error occurred, your message has not been sent."

enter image description here

Domande:
1. Forse qualcuno prova questo con successo?
2. Devo aggiungere qualche altro parametro per farlo funzionare?



EDIT: Ci sono 2 diversi metodi di richiesta HTTP,

  1. la Carica URI per le richieste di upload media, e
  2. il Metadata URI per i metadati solo richiede

The API Explorer currently supports metadata requests only, che significa messaggi di testo normale senza allegato, e questo è quello che sto cercando di fare.

+0

sicuro, certo che ha autorizzato la richiesta di prima, altrimenti credo che non avrei avuto un 200 OK 'indietro ... – Taifun

+0

@Taifun', Come hai creato la stringa RFC 2822, c'è qualche biblioteche o difficile lo ha codificato, qualche esempio? – Sasikanth

+0

@Sasikanth Dipende dal tuo linguaggio di programmazione preferito. [vedi la mia risposta qui sotto] (http://stackoverflow.com/a/24461102/1545993) su come base64 web-safe codificare il messaggio completo – Taifun

risposta

40

capito!

dopo aver letto il RFC 2822 specification ho scoperto, che il messaggio completo deve essere passato nel parametro raw, vedere l'esempio:

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

Così, dopo la codifica Base64 il messaggio completo, passando nel parametro raw senza usare nessun altro parametro, funziona bene.

Edit 1:
Come accennato @Amit, deve essere web-safe Base64 codificato, puoi anche https://code.google.com/p/stringencoders/wiki/WebSafeBase64

Quindi, per convertire l'alfa Base64 in un formato che è "web- sono raccomandati sicuri" i seguenti modifiche:

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

Per unico neo vert + a - e / a _ era sufficiente per me.

Edit 2:
di rispondere alla domanda di @Hjulle qui un esempio: è necessario solo il userId e nel corpo della richiesta del parametro raw. Supponiamo, il tuo indirizzo e-mail è [email protected]

Prima Base64 codificare il messaggio completo (vedi sopra) utilizzando un online encoder e si ottiene questa stringa:

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h 
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92 
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh 
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4= 

Ora convertire +-- e / per _ e si ottiene

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h 
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92 
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh 
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4= 

Ora passare questo nel parametro raw delle API Explorer.

+1

codifica url richiesta. http://stackoverflow.com/questions/22128789/converting-string-to-web-safe-base64-format –

+0

https://gist.github.com/AkashkumarDev/20ab002e7f5785ae778e qualsiasi idea di dove sia un problema? – akdev

+0

@akdev per domande, per favore inizia una nuova domanda invece di commentare qui. grazie. – Taifun

1

Nota: Questa è una risposta specifica per PHP, ma sono sicuro che alcuni di voi lo troveranno utile.

Nel caso in cui tu abbia difficoltà a configurare correttamente i dati grezzi in PHP come ho fatto io, usare PHPMailer renderebbe le cose più pulite e più facili per te.

Dopo compresa la biblioteca nel codice (se si utilizza il compositore, basta aggiungere "phpmailer/phpmailer": "~ 5.2" nella sezione richiedere del composer.json), è possibile impostare i dettagli di 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(); 

Ora puoi codificare in base64 il $ mime per ottenere la stringa non elaborata per l'API di Gmail. Utilizzare questo invece di semplice base64_encode, al fine di ottenere una stringa codificata sicura per il Web valida. rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');

Problemi correlati