【问题标题】:How to send an existing message in a new email without losing formatting如何在不丢失格式的情况下在新电子邮件中发送现有消息
【发布时间】:2020-02-10 16:23:41
【问题描述】:

背景: 我正在尝试将收件箱中的现有电子邮件发送到新线程。

问题: 我已经使用this function 成功发送了电子邮件正文,但是正文丢失了原始电子邮件的格式,只发送文本。

我认为将整个有效负载添加到请求正文中更有意义,如 gmail API page“试用此 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}

发送的电子邮件没有内容。如何将现有电子邮件添加到新线程而无需解码和编码并丢失电子邮件的格式?

【问题讨论】:

    标签: python email gmail-api mime-types


    【解决方案1】:

    在搞砸之后,我创建了两个函数,可以将 plainhtml 内容类型传递给可能遇到困难的任何人的新电子邮件:

    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 内容类型。

    【讨论】:

      【解决方案2】:

      如果您从 Gmail 用户界面打开一封电子邮件,请点击三个点并选择“显示原件”,

      你可以观察邮件结构

      示例:

      留言

      显示原文

      • 可以看到消息是multipart/alternative,包含一个text/plain和一个text/html部分

      • 如果您使用示例中的整个突出显示的代码作为邮件正文,格式将被保留。您只需指定FromToSubject 标头即可。

      【讨论】:

      • 您尚未指定如何使用 gmail API 以编程方式将突出显示的代码添加到正文中。
      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 2019-06-09
      • 2014-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多