【问题标题】:How to create a draft message in existing thread with gmail API如何使用 gmail API 在现有线程中创建草稿消息
【发布时间】:2019-04-25 03:25:53
【问题描述】:

使用 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 上没有看到任何关于它的文档

在创建草稿阶段执行draft = service.users().drafts().create(userId=user_id, body={'threadId': &lt;threadId&gt;}, media_body=message_body['media_body']).execute() 时,我尝试将threadId 添加到草稿正文中,但它被忽略了。

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

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

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

【问题讨论】:

    标签: python gmail-api


    【解决方案1】:
    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()
    

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

    查看您应该发送的示例的一个很好的资源是 GMail 'show original'。打开一封电子邮件 -> 三个按钮 -> 显示原件。这将打开一个页面,您可以在其中看到当您(您的人)发送电子邮件时 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”字段

    这是最终结果的屏幕截图:

    【讨论】:

      【解决方案2】:

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

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

      1. 请求的threadId 必须在MessageDraft.Message 您提供您的要求。
      2. ReferencesIn-Reply-To 标头必须设置为符合要求 符合RFC 2822 标准。
      3. Subject 标头必须匹配。

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

      【讨论】:

      • 您能否使用 python 客户端添加代码 sn-p,因为正如我在帖子中提到的,我尝试添加 threadId 并且对于草稿,它被简单地忽略了,草稿是在新线程中创建的(尽管这适用于向线程添加非草稿消息)
      • 这里也一样。当我尝试将草稿添加到任何线程时。对于第一条消息不包括任何参考和回复。
      猜你喜欢
      • 2020-04-24
      • 2017-06-17
      • 2010-11-15
      • 1970-01-01
      • 2018-04-19
      • 2018-02-20
      • 1970-01-01
      • 2016-06-10
      • 2014-10-19
      相关资源
      最近更新 更多