管理线程

Gmail API 使用 Thread 资源将带有原始邮件的电子邮件回复组合到单个会话或会话中。这样,您就可以按顺序检索对话中的所有消息,从而更轻松地获得消息的上下文或优化搜索结果。

邮件一样,会话可能也会应用标签。但是,与消息不同,您无法创建线程,而只能删除线程。但是,消息可以插入到会话中。

目录

正在检索会话

线程提供了一种按顺序检索会话中消息的简单方法。 通过列出一组会话,您可以选择按会话对消息进行分组,并提供额外的上下文。您可以使用 threads.list 方法检索线程列表,也可以使用 threads.get 检索特定线程。您还可以使用与 Message 资源相同的查询参数来过滤线程。如果线程中的任何消息与查询匹配,结果中会返回该线程。

以下代码示例演示了如何在显示收件箱中聊天会话次数最多的示例中同时使用这两种方法。threads.list 方法会提取所有线程 ID,然后 threads.get 会抓取每个线程中的所有消息。对于有 3 条或更多回复的回复,我们会提取 Subject 行,并显示非空行以及线程中的消息数量。您还可以在相应的 DevByte 视频中找到此代码示例。

Python

gmail/snippet/thread/threads.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def show_chatty_threads():
  """Display threads with long conversations(>= 3 messages)
  Return: None

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create gmail api client
    service = build("gmail", "v1", credentials=creds)

    # pylint: disable=maybe-no-member
    # pylint: disable:R1710
    threads = (
        service.users().threads().list(userId="me").execute().get("threads", [])
    )
    for thread in threads:
      tdata = (
          service.users().threads().get(userId="me", id=thread["id"]).execute()
      )
      nmsgs = len(tdata["messages"])

      # skip if <3 msgs in thread
      if nmsgs > 2:
        msg = tdata["messages"][0]["payload"]
        subject = ""
        for header in msg["headers"]:
          if header["name"] == "Subject":
            subject = header["value"]
            break
        if subject:  # skip if no Subject line
          print(f"- {subject}, {nmsgs}")
    return threads

  except HttpError as error:
    print(f"An error occurred: {error}")


if __name__ == "__main__":
  show_chatty_threads()

向会话添加草稿和邮件

如果您要发送或迁移的邮件是对其他电子邮件或对话的一部分的回复,您的应用应将该邮件添加到相关线程中。这样,参与会话的 Gmail 用户可以更轻松地将消息保留在上下文中。

可以在创建更新发送草稿消息的过程中,将草稿添加到线程。您还可以在插入发送消息的过程中向会话添加消息。

消息或草稿必须满足以下条件才能作为会话的一部分:

  1. 必须在您在请求提供的 MessageDraft.Message 中指定请求的 threadId
  2. ReferencesIn-Reply-To 标头的设置必须符合 RFC 2822 标准。
  3. Subject 标头必须一致。

请查看创建草稿发送消息示例。在这两种情况下,您只需将与线程 ID 配对的 threadId 键添加到消息的元数据(即 message 对象)中。