如何在不丢失格式的情况下在新电子邮件中发送现有邮件
How to send an existing message in a new email without losing formatting
上下文:
我正在尝试将收件箱中的现有电子邮件发送到新线程。
问题:
我已经使用 this function 成功发送了电子邮件正文,但是正文丢失了原始电子邮件的格式并且只发送了文本。
我认为将整个负载添加到请求正文中更有意义,如 gmail API page "Try this 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}
发送的电子邮件没有内容。如何将现有电子邮件添加到新线程,而不必解码和编码并丢失电子邮件的格式?
如果您打开来自 Gmail UI 的电子邮件,请单击三个点并选择 "Show original"、
可以观察邮件结构
示例:
Message
Show original
可以看到消息是multipart/alternative
,包含一个text/plain
和一个text/html
部分
如果您使用示例中整个突出显示的代码作为消息的 body,格式将被保留。您只需要指定 From
、To
和 Subject
headers。
在搞砸之后,我制作了两个函数,可以将 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
内容类型。
上下文: 我正在尝试将收件箱中的现有电子邮件发送到新线程。
问题: 我已经使用 this function 成功发送了电子邮件正文,但是正文丢失了原始电子邮件的格式并且只发送了文本。
我认为将整个负载添加到请求正文中更有意义,如 gmail API page "Try this 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}
发送的电子邮件没有内容。如何将现有电子邮件添加到新线程,而不必解码和编码并丢失电子邮件的格式?
如果您打开来自 Gmail UI 的电子邮件,请单击三个点并选择 "Show original"、
可以观察邮件结构
示例:
Message
Show original
可以看到消息是
multipart/alternative
,包含一个text/plain
和一个text/html
部分如果您使用示例中整个突出显示的代码作为消息的 body,格式将被保留。您只需要指定
From
、To
和Subject
headers。
在搞砸之后,我制作了两个函数,可以将 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
内容类型。