16
votes

Edit: addressing the first comment below and for clarity, this isn't a code question. The question is simply:

What do I put into the URI querystring of the new Gmail UI to view a draft message created by the Gmail API?

Despite this not really being a code question, I'm asking on Stack Overflow as it's Google's preferred platform for Gmail API questions.

--

If I view a draft message in the new Gmail UI, the URI is something like this:

https://mail.google.com/mail/u/1/?zx=iij9apqgzdf4#drafts?compose=jrjtXSqXwlFGnSGCQgDCdnHGVFdlpFMgzsCNgpQstQLxdLCMkjKstBmWZkCmjhWTQnpsZCJF

I can't see any way to create such a link from the Id or ThreadId of a message created via the Gmail API.

Previously, one could do this:

https://mail.google.com/mail/u/1/?zx=ov61dxfbrcga#drafts?compose=1631caae9dbb074d

where the value of "compose" is the Id.

How can the same thing be accomplished in the new UI?

4
Can you add any details like: code used, error problem encountered? How do I ask a good question?, How to create a Minimal, Complete, and Verifiable example Show the community what you have tried.noogui
Since this week it seems to work. When I open the new UI with an older threadId, it redirects to the new threadId of the mail/answer. Can you confirm that?Frank Szilinski
Not happening for me, Frank. Do you mean like this? mail.google.com/mail/ca/u/1/#drafts?compose=1661237c4db71aceChris Wood

4 Answers

12
votes

I've been encountering the same problem and have had some success in this problem, as well as some issues I still can't get past.

Good news: The new compose parameter format is some kind of "base40" encoding. I searched the Gmail source for a restricted alphabet string, and found and deobfuscated the bit of code doing this encoding/decoding: https://gist.github.com/danrouse/52212f0de2fbfe33cfc56583f20ccb74

This code includes an encode and decode function which should work for Gmail-format query parameters.

Bad news: The values that it is encoding to open draft emails do not appear to be available using the Gmail API. Specifically, they look like this: thread-f:NEW_THREAD_ID+msg-a:DRAFT_ID -- while the draft ID is the same as it was before, the Thread ID does not appear to match any of the IDs that the Gmail API returns.

Interestingly, if you inspect the subject row in the Gmail UI, it has dataset attributes including all of both the old format and new format IDs - but it's still unclear how to get the new ones programatically.

5
votes

Thanks to @frank-szilinski - he pointed out that the old format is now translated. I.e. this now works again:

https://mail.google.com/mail/ca/u/1/#drafts/1661237c4db71ace

It doesn't seem to work when the Gmail tab isn't already open, however.

3
votes

Building on @kremonte gist, and @chris-wood comments, I made a rails gem that correctly creates the open-the-draft-inside-gmail URL.

It's here - https://github.com/GoodMeasuresLLC/gmail_compose_encoder

It's for the use case of "my code created a draft (prepopulated with some text, of course) and now I want to open the draft in compose mode so that my user can review it before hitting "send".

0
votes

How to get the URL for a draft

If, for example you use a list request from which you get your draft objects:

{
  "id": string,
  "message": {
    object (Message)
  }
}

You can take this id and put it into a URL in this format:

mail.google.com/mail/#inbox?compose=[id]

Eg.

mail.google.com/mail/#inbox?compose=3doinm3d08932d

This will open up GMail with the relevant draft open.