Python MIME头文件无法通过Gmail API访问

Python MIME头文件无法通过Gmail API访问,python,mime,gmail-api,Python,Mime,Gmail Api,我正试图通过Gmail API自动创建草稿,我希望这些草稿是对现有电子邮件的回复。要做到这一点,我认为我需要设置“threadId”头(特定于Gmail)、“References”头和“In Reply To”头。另外,对于Gmail考虑消息是一个回复,“主题”标题必须匹配原始电子邮件。 我将所有这些头硬编码到一个MIMEText对象中,然后将消息作为一个字符串进行base-64编码(urlsafe),并让gmailapi传递它。然而,“threadId”、“In Reply To”和“Refe

我正试图通过Gmail API自动创建草稿,我希望这些草稿是对现有电子邮件的回复。要做到这一点,我认为我需要设置“threadId”头(特定于Gmail)、“References”头和“In Reply To”头。另外,对于Gmail考虑消息是一个回复,“主题”标题必须匹配原始电子邮件。 我将所有这些头硬编码到一个MIMEText对象中,然后将消息作为一个字符串进行base-64编码(urlsafe),并让gmailapi传递它。然而,“threadId”、“In Reply To”和“References”标题似乎从未出现在发送的电子邮件中,因为在Gmail UI中单击“Show original”时显示的MIME中不存在这些标题

new = MIMEText("reply body text")
new["In-Reply-To"] = "[Message-ID of email to reply to]" #looks like <..@mail.gmail.com>
new["References"] = "[Message-ID of email to reply to]" #looks like <..@mail.gmail.com>
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()
new=MIMEText(“回复正文”)
新建[“回复”]=“[要回复的电子邮件的邮件ID]”#如下所示
新的[“引用”]=“[要回复的电子邮件的邮件ID]”#看起来像
新的[“threadId”]=“[要回复的邮件的threadId]”#看起来像14ec476abbce3421
新建[“主题”]=“Testsend2”
新建[“收件人”]=“[发送至的电子邮件]”
新建[“发件人”]=“[发送电子邮件的发件人]”
messageToDraft={'raw':base64.urlsafe_b64encode(new.as_string())}
message={'message':messageToDraft}
draft=service.users().draft().create(userId=“me”,body=message).execute()

事实上,这要简单得多!如果你只是在标题中提供了正确的主题,在正文中提供了正确的threadId,谷歌将为你计算所有引用

new = MIMEText("This is the placeholder draft message text.")
new["Subject"] = "Example Mail"
new["To"] = "emtholin@gmail.com"
new["From"] = "emtholin@gmail.com"

raw = base64.urlsafe_b64encode(new.as_string())
message = {'message': {'raw': raw, 'threadId': "14ec598be7f25362"}}
draft = service.users().drafts().create(userId="me", body=message).execute()
这将产生一份草稿,准备以正确的线程发送:

然后,我发邮件。如您所见,这些参考是为您计算的:

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: emtholin@gmail.com
Message-ID: <CADsZLRxuyFhuGNPwjRrfFVQ0_2MxO=_jstjmsBGmAiwMEvfWSg@mail.gmail.com>
Subject: Example Mail
From: Emil Tholin <emtholin@gmail.com>
To: Emil Tholin <emtholin@gmail.com>
Content-Type: text/plain; charset=UTF-8

This is the placeholder draft message text.
MIME版本:1.0
收到:于10.28.130.132之前通过HTTP;2015年7月25日星期六07:54:12-0700(PDT)
答复:
参考资料:
日期:2015年7月25日星期六16:54:12+0200
交付给:emtholin@gmail.com
消息ID:
主题:示例邮件
发件人:埃米尔·索林
致:埃米尔·索林
内容类型:文本/纯文本;字符集=UTF-8
这是占位符草稿消息文本。

如果您不仅希望创建草稿,还希望另外发送草稿,则扩展上述代码(草稿后面的另一行=…create().execute():


非常好的解决方案,谢谢。我后来意识到类似的事情是可能的,尽管我更喜欢你的解决方案:如果你用同一个收件人和主题前面加了“Re:”的草稿,Gmail会计算并附加必要的标题。@monstermac77没问题!:)酷!很高兴知道。@Thole知道如何在Google应用程序脚本中做同样的事情吗?它似乎忽略了“message”:{“raw”:rawcoded,“threadID”:threadID}@Layla中的threadID,遗憾的是,我从未使用过Apps脚本。也许这个文档可以提供一些线索?这会创建一个草稿回复,但与我手动创建回复时有所不同。当我在Gmail中手动执行此操作时:单击“回复”,然后开始键入消息,然后导航到别处并返回到电子邮件,您可以在原始电子邮件的底部看到电子邮件草稿。使用API时不会发生这种情况。
threadId
不应作为
raw
键的一部分发送,因为它必须是独立的。因此
消息
应包含{
raw
:my_raw,
threadId
:my_thread\id}
    draft = service.users().drafts().create(userId="me", body= message).execute()
    message = service.users().drafts().send(userId='me', body={'id': draft['id']}).execute()