Как отправить существующее письмо в новую ветку с помощью API Gmail - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь отправить существующее письмо в другой поток, используя API Gmail во Flask.

Контекст: Я создал новый объект сообщенияи успешно сделали In-Reply-To, References и threadId равными message_id и thread_id соответственно. (Следуя Справка по API Gmail )

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.

Затем, когда я следую примеру кода из этой темы :

  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?

Примечание: Я нашел похожие вопросы здесь для javascript и здесь для java , но не нашел ответа для python.

1 Ответ

1 голос
/ 11 октября 2019

Как можно узнать из информации, предоставленной по указанным вами ссылкам, вам не нужно указывать In-Reply-To и References, чтобы включить многопоточность, указав threadId в теле запроса и сделав Subject вдостаточно простого совпадения тела сообщения, как указано в документации .

Выполните следующие изменения:

  1. Удалите строку message['threadId'] = thread_id - идентификатор потокапринадлежит телу запроса, а не телу сообщения
  2. Заменить message.as_bytes() на message.as_string() - как указано в документации : метод base64.urlsafe_b64encode ожидает строку - это где вашвозникает ошибка.

Пример:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...