Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MIME Headers Not Making it Through Gmail API

I'm trying to automate the creation of drafts via the Gmail API, and I want these drafts to be responses to existing emails. To do this, I believe I need to set the "threadId" header (Gmail specific), the "References" header, and the "In-Reply-To" header. Additionally, for Gmail to consider the message to be a reply, the "Subject" header must match the original email.

I'm hardcoding all of these headers into a MIMEText object, and then base-64 encoding (urlsafe) the message as a string and having the Gmail API deliver it. However, the "threadId", "In-Reply-To", and "References" headers don't appear to ever make it in the email that's sent, as they don't exist in the MIME shown when clicking "Show original" in the Gmail UI.

new = MIMEText("reply body text")
new["In-Reply-To"] = "[Message-ID of email to reply to]" #looks like <[email protected]>
new["References"] = "[Message-ID of email to reply to]" #looks like <[email protected]>
new["threadId"] = "[threadId of message to reply to]" #looks like 14ec476abbce3421
new["Subject"] = "Testsend2"
new["To"] = "[Email to send to]"
new["From"] = "[Email to send from]"

messageToDraft = {'raw': base64.urlsafe_b64encode(new.as_string())}
message = {'message': messageToDraft}
draft = service.users().drafts().create(userId="me", body=message).execute()
like image 876
monstermac77 Avatar asked Jul 25 '15 11:07

monstermac77


2 Answers

Actually, it's a lot simpler than that! If you just supply the correct Subject in the headers, and the correct threadId in the body, Google will calculate all the references for you.

new = MIMEText("This is the placeholder draft message text.")
new["Subject"] = "Example Mail"
new["To"] = "[email protected]"
new["From"] = "[email protected]"

raw = base64.urlsafe_b64encode(new.as_string())
message = {'message': {'raw': raw, 'threadId': "14ec598be7f25362"}}
draft = service.users().drafts().create(userId="me", body=message).execute()

This results in a draft, ready to be sent in the correct thread:

enter image description here

Then, I send the mail. As you can see, the references are calculated for you:

MIME-Version: 1.0
Received: by 10.28.130.132 with HTTP; Sat, 25 Jul 2015 07:54:12 -0700 (PDT)
In-Reply-To: <CADsZLRz5jWF5h=6Cs1F45QQOiFuqNGmMeb6St5e-tOj3stCNiA@mail.gmail.com>
References: <CADsZLRwmDZ_L5_zWqE8qOgoKuvRiRTWUopqssn4+XYGM_SKrfg@mail.gmail.com>
    <CADsZLRz5jWF5h=6Cs1F45QQOiFuqNGmMeb6St5e-tOj3stCNiA@mail.gmail.com>
Date: Sat, 25 Jul 2015 16:54:12 +0200
Delivered-To: [email protected]
Message-ID: <CADsZLRxuyFhuGNPwjRrfFVQ0_2MxO=_jstjmsBGmAiwMEvfWSg@mail.gmail.com>
Subject: Example Mail
From: Emil Tholin <[email protected]>
To: Emil Tholin <[email protected]>
Content-Type: text/plain; charset=UTF-8

This is the placeholder draft message text.
like image 50
Tholle Avatar answered Oct 22 '22 06:10

Tholle


if you want to not only create the draft but also additionally send it then extension of above code (one additional line after draft =...create().execute():

    draft = service.users().drafts().create(userId="me", body= message).execute()
    message = service.users().drafts().send(userId='me', body={'id': draft['id']}).execute()
like image 44
Ani Avatar answered Oct 22 '22 04:10

Ani