Как отправить существующее сообщение в новое письмо без потери форматирования - PullRequest
1 голос
/ 14 октября 2019

Контекст: Я пытаюсь отправить существующее электронное письмо из папки «Входящие» в новую ветку.

Проблема: Я успешно отправил тело письма, используя эту функцию , однако тело теряет форматирование исходного письма и отправляет только текст.

Я думаю, что имеет смысл добавить всю полезную нагрузку в тело запроса, как описано на странице gmail API Раздел «Попробуйте этот API»:

Однако, когда я добавляю полезную нагрузку в тело запроса:

def create_message(sender, to, subject, thread_id, message_id, payload, 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.
  """

  message = MIMEMultipart('alternative')
  message['to'] = to
  message['from'] = sender
  message['subject'] = 'Re: %s' %subject

  return {'raw': raw, 'threadId': thread_id, 'payload': payload}

Письма отправляются без содержимого. Как я могу добавить существующее письмо в новую ветку без необходимости декодировать и кодировать и терять форматирование письма?

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

После возни я сделал две функции, которые могут передавать типы контента plain и html новому электронному письму для всех, кто может испытывать трудности:

def get_all_parts(service, user_id, msg_id):
  message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
  msg_bytes = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
  b = email.message_from_bytes(msg_bytes)
  body = []

  if b.is_multipart():
    for part in b.walk():
      if part.get_content_maintype() != 'multipart':
        this_part = []
        this_part.append(part.get_payload(decode=True))
        this_part.append(part.get_content_type())
        body.append(this_part)

  return body

def create_message(sender, to, subject, thread_id, message_id, message_text, service):
  message = MIMEMultipart()
  message['to'] = to
  message['from'] = sender
  message['subject'] = 'Re: %s' %subject
  for part in message_text:
    text = part[1].split('/') # 'text/plain' -> ['text', 'plain']
    new_part = MIMEText(str(part[0]), text[1])
    print(part[1])
    message.attach(new_part)

  raw = base64.urlsafe_b64encode(message.as_string().encode('UTF-8')).decode('ascii')   
  body = {'raw': raw, 'threadId': thread_id}

enter code here

Это определенно неисчерпывающая функция для всех электронных писем, но работает для alternative типов контента.

0 голосов
/ 14 октября 2019

Если вы откроете электронное письмо из пользовательского интерфейса Gmail, нажмите на три точки и выберите «Показать оригинал»,

, вы сможете наблюдать структуру электронной почты

Пример:

Сообщение

enter image description here

Показать оригинал

enter image description here

  • Вы можете видеть, что сообщение multipart/alternative и содержит text/plain и text/html часть

  • Если вы используете весь выделенный код в образце в качестве тела сообщения, форматирование будет сохранено. Вам нужно только указать заголовки From, To и Subject.

...