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()
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:
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.
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With