如何使用gmail API在现有线程中创建草稿消息

时间:2018-11-22 12:28:51

标签: python gmail-api

使用python Google客户端,我可以在ID为threadId的现有线程中创建新消息,如下所示:

message = (service.users().messages().send(userId='me', body={'threadId': <threadId>}, media_body=message['media_body'])
           .execute())

(这里我使用的是media_body,因为它支持大型附件的/upload端点)

这对于邮件来说很好用,threadId可选参数记录在https://developers.google.com/gmail/api/v1/reference/users/messages/send

但是在创建新的草稿消息时,我做不到同样的事情,并且在https://developers.google.com/gmail/api/v1/reference/users/drafts/create上没有看到关于它的任何文档

在创建草稿阶段进行threadId时,我尝试将draft = service.users().drafts().create(userId=user_id, body={'threadId': <threadId>}, media_body=message_body['media_body']).execute()添加到草稿正文中,而只是将其忽略。

我还尝试在发送草稿阶段将threadId添加到正文:message = service.users().drafts().send( userId='me', body={'id': draft_id, threadId': <threadId>}).execute(),这也被忽略了。

无论哪种方式,草案消息都是在其自己的新线程中创建的。

如何使用gmail API(特别是Python客户端)在现有线程中创建新的草稿消息?

2 个答案:

答案 0 :(得分:0)

根据documentation,草稿可以作为creatingupdatingsending草稿消息的一部分添加到线程中。

  

要成为主题的一部分,消息或草稿必须满足以下条件:

     
      
  1. 必须在threadId上指定请求的Message或   Draft.Message随您的要求提供。
  2.   
  3. 必须按照法规设置ReferencesIn-Reply-To标头   符合RFC 2822标准。
  4.   
  5. Subject标头必须匹配。
  6.   

该文档还指出,在creating a draftsending a message的两个示例中,您只需将一个与线程ID配对的threadId密钥添加到消息的元数据{{1} }对象。

答案 1 :(得分:0)

email = self.service.users().messages().get(userId='me', id='1756f9403f66ac1d').execute() # sub in your message id

def get_field(self, email, field_name):
    header = email['payload']['headers']
    for m in header:
        if m['name'] == field_name:
            return m['value']

def add_draft(self, email, body):
    message = MIMEText(body)
    message['to'] = 'to@email.com'
    message['from'] = 'from@email.com'
    message['subject'] = self.get_field(email, 'Subject')
    message['In-Reply-To'] = self.get_field(email, 'Message-ID')
    message['References'] = self.get_field(email, 'Message-ID')# + ',' + self.get_field_a(email, 'References')
    email_body = {'message' : {'threadId' : email['threadId'], 'raw' : base64.urlsafe_b64encode(message.as_string().encode('utf-8')).decode()}}
    draft = self.service.users().drafts().create(userId='me', body=email_body).execute()

在上面的示例中,我添加了草稿,作为对一个发送给我一条消息的全新线程的响应。该特定电子邮件的标题中没有值“ References”,因此我注释掉了从接收的电子邮件中提取该字段并将其添加到草稿中的部分。相信要为更长的线程添加草稿,我相信您需要阅读并附加此字段。读者可以在练习中安全地附加字段:)

GMail“显示原件”是查看您应发送的示例的重要资源。打开电子邮件->三个按钮->显示原件。这会打开一个页面,您可以在您(您的人工)发送电子邮件时看到gmail正在为您发送的电子邮件中的实际字段值。例如,这是第二个消息在不同线程中的引用和答复部分:

References: <1243993195.RE.1603730339394.ref@mail.yahoo.com>,<1243993195.REDACTED.1603730339394@mail.yahoo.com>
In-Reply-To: <1243993195.REDACTED.1603730339394@mail.yahoo.com>

在这种情况下,“ In-Reply-To”被设置为先前消息的“ Message-Id”字段,“ References”被设置为先前“ Message-Id”加上先前的“ References”字段< / p>

这是最终结果的屏幕截图: enter image description here