【问题标题】:How to send an existing email to a new thread using gmail API如何使用 gmail API 将现有电子邮件发送到新线程
【发布时间】:2020-02-08 17:19:49
【问题描述】:

我正在尝试使用 Flask 中的 gmail API 将现有电子邮件发送到另一个线程。

背景: 我创建了一个新的消息对象并成功地使In-Reply-ToReferencesthreadId 分别等于message_idthread_id。 (关注Gmail's API reference

def create_message(sender, to, subject, thread_id, message_id, message_text, service):
  """Create a message for an email.

  Args:
    sender: Email address of the sender.
    to: Email address of the receiver.
    subject: The subject of the email message.
    message_text: The text of the email message.

  Returns:
    An object containing a base64url encoded email object.
  """
  if type(message_text) != str:
    message_text = str(message_text)

  message = MIMEText(message_text)
  message['to'] = to
  message['from'] = sender
  message['subject'] = subject
  message['In-Reply-To'] = message_id
  message['References'] = message_id
  message['threadId'] = thread_id
  print('created message threadId: %s does == ..' %message['threadId'])
  print(thread_id)

  raw = base64.urlsafe_b64encode(message.as_bytes())
  raw = raw.decode()
  body = {'raw': raw}

  messages = service.users().messages()
  send = messages.send(userId='me', body=body).execute()

问题: 我能够成功地将新邮件发送到我的收件箱,但它们是使用新的threadId 创建的,即使上面代码中的打印语句显示相同的threadId

然后,当我按照代码示例from this thread

  body = {'message': {'raw': raw, 'threadId': thread_id}}

我收到以下错误:

googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "'raw' RFC822 payload message string or uploading message via /upload/* URL required">

问题: 如何生成这些电子邮件,以便它们使用相同的 threadId

注意:我发现了类似的问题here for javascripthere for java,但没有找到python的答案。

【问题讨论】:

    标签: python email flask gmail gmail-api


    【解决方案1】:

    从您提供的链接中的信息可以收集到,您不需要提供In-Reply-ToReferences 来启用线程,在请求正文中提供threadId 并使Subjectdocumentation 中指定的原始消息正文匹配就足够了。

    请进行以下修改:

    删除message['threadId'] = thread_id这一行 - threadId 属于请求正文,而不是消息正文

    示例:

    def create_message(sender, to, subject, thread_id, message_text, service):
      """Create a message for an email.
    
      Args:
        sender: Email address of the sender.
        to: Email address of the receiver.
        subject: The subject of the email message.
        message_text: The text of the email message.
    
      Returns:
        An object containing a base64url encoded email object.
      """
      if type(message_text) != str:
        message_text = str(message_text)
    
      message = MIMEText(message_text)
      message['to'] = to
      message['from'] = sender
      message['subject'] = subject
      raw = base64.urlsafe_b64encode(message.as_bytes())
      raw = raw.decode()
      body = {'raw': raw, 'threadId':thread_id}
      messages = service.users().messages()
      send = messages.send(userId='me', body=body).execute()
    

    【讨论】:

    • 在您提供的文档链接中,它在底部显示:“1. 请求的threadId 必须在您提供的MessageDraft.Message 上指定。2. ReferencesIn-Reply-To 标头必须按照 RFC 2822 标准进行设置。”即具有相同的message_id
    • 回复修改 1:我确实尝试删除它并将其添加到请求正文中,如问题中所述,但是 HTTP 错误并非源自您在您的2次修改。我应该提到,在 python 3 中,需要 as_bytes() 方法,如下所述:github.com/googleapis/google-api-python-client/issues/93
    • developers.google.com/gmail/api/v1/reference/users/messages/… 指定 threadId 是一个不进入行消息正文的可选属性 - 即它不需要编码。您可以使用文档中相应的“Try this API”方法自行测试。 References 和 In-Reply-To 标头必须按照 RFC 2822 标准进行设置 - 如果已设置,但不需要设置。
    • 我根据 python 3 的要求更新了我的代码,它现在应该可以为你工作并且线程正确。
    • 感谢@ziganotschka,“试用此 API”部分帮助我更好地理解了 HTTP 请求的格式。
    猜你喜欢
    • 2019-04-08
    • 2018-01-26
    • 2014-08-27
    • 2018-02-23
    • 2021-01-24
    • 2021-09-11
    • 2015-01-02
    • 2017-04-14
    • 2019-10-16
    相关资源
    最近更新 更多