How to send a message successfully using the new Gmail REST API?

gmail, gmail-api, rest

Solution

got it!

after reading the RFC 2822 specification I found out, that the complete message needs to be passed in the `raw` parameter, see the example:

From: John Doe <jdoe@machine.example> 
To: Mary Smith <mary@example.net> 
Subject: Saying Hello 
Date: Fri, 21 Nov 1997 09:55:06 -0600 
Message-ID: <1234@local.machine.example>

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

So after base64 encoding the complete message, passing it in the `raw` parameter without using any other parameter, it works fine.

Edit 1: As @Amit mentioned, it must be web-safe base64 encoded, see also https://code.google.com/p/stringencoders/wiki/WebSafeBase64

So to convert the base64 alpha into a format that is "web-safe" the following changes are recommended:

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

To only convert `+` to `-` and `/`to `_` was sufficient for me.

Edit 2: To answer the question of @Hjulle here an example: you only need the `userId` and in the request body the `raw` parameter. Let's assume, your email address is `jdoe@machine.example`

First Base64 encode the complete message (see above) using an online encoder and you get this string:

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

Now convert `+` to `-` and `/`to `_` and you get

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

Now pass this in the `raw` parameter of the API Explorer.

Problem

I'm currently trying to test the new Gmail REST API. In the API Explorer it is possible to authorize requests using OAuth 2.0 and to execute a request, i.e. send a message. First I authorized. I'm using the following test data (and of course I used a valid `to` email address): ``` { "raw": "c2VuZGluZyBhIG1haWwgdXNpbmcgR21haWwgUkVTVCBBUEk=", "payload": { "headers": [ { "name": "to", "value": "info@something.com" }, { "name": "from", "value": "taifunbaer@gmail.com" }, { "name": "subject", "value": "Test Gmail REST API" } ], "mimeType": "text/plain" } } ``` I also get a `200 OK` and the following result back, which looks fine. ``` { "id": "146dee391881b35b", "threadId": "146dee391881b35b", } ``` However, the mail will not be sent successfully and I can find an message from `nobody@gmail.com` in the inbox instead;: `"An error occurred, your message has not been sent."` Questions: 1. Did someone test this successfully? 2. Do I have to add some other parameter to get this running? EDIT: There are 2 different HTTP request methods, - the Upload URI for media upload requests, and - the Metadata URI for metadata-only requests `The API Explorer currently supports metadata requests only`, which means plain-text messages without attachment, and this is what I'm trying to do.

Original source

Related problems