繁体   English   中英

从 Gmail 解码 MIME email API - \r\n 和 3D - Python

[英]Decoding MIME email from Gmail API - \r\n and 3D - Python

我目前正在使用 Gmail API 阅读 Python 中的一些 HTML 电子邮件。我使用以下方法解码了他们的正文:

base64.urlsafe_b64decode

打印出结果 HTML email 后,“\r\n”和“3D”分散在 HTML 周围。我无法删除“\r\n”,因为 \ 和 r 和 \ 和 n 注册为不同的字符( ?)而且我不确定“3D”是从哪里来的。

我的解码方式有问题吗?

这是代码:

results = service.users().messages().list(userId='me', q = 'is: unread').execute()

for index in range(len(results['messages'])):
    message = service.users().messages().get(userId='me', id=results['messages'][index]['id'], format='raw').execute()

    msg_str = base64.urlsafe_b64decode(message['raw'].encode('UTF-8'))

    mime_msg = email.message_from_string(str(msg_str))

    print(mime_msg)

    service.users().messages().modify(userId='me', id=results['messages'][index]['id'], body = {'removeLabelIds': ['UNREAD']}).execute() # mark message as read

我找到了解决方案-我停止使用Python中的电子邮件库,并将msg_str转换为字符串(字节类型)。 从那里,我只是从字符串中删除了'\\r\\n'并将'=3D'替换为'='

这不是一个很好的解决方案,而是使用类似

for email_part in message.walk(): 
    part_data = email_part.get_payload(decode=True) 

其中message是Python email.message.Message obj。 然后也许使用类似BeautifulSoup之类的方法来有效地分析HTML。 希望有帮助!

只要设置了str.decode('utf-8'),maksel的解决方案就可以为我工作。 原始代码经过编码,而不是解码后的字节字符串。

因此,在python 3.7下,我们可以替换为:

msg = msg.replace('\r\n', '').replace('=3D', '=')

请警惕,因为在我的情况下,此解决方案不适用于所有html标签。

我可能来晚了一点。 提到的一些解决方案有效。 但是为了帮助访问这里的其他人,我想发布这个答案,因为它看起来更干净一些。

构建邮件 object 时使用policy=email.policy.default 这将删除提到的=3D\r\n等。

mailobject = email.message_from_string(msg_str,  policy=email.policy.default)

如果在 Python 3.6+ 上,您可以使用get_bodyget_content方法。

if mailobject.is_multipart():
    body = mailobject.get_body(('html',))
else:
    body = mailobject.get_body(('plain',))

if body:
    body = body.get_content()

print(body)

上面的代码非常少,只是为了满足答案。 这里我们假设它要么是普通的,要么是 html。请记住在处理电子邮件时要考虑到其他情况。

一个额外的无关提示:

由于这是一个编码问题,因此该答案也适用于其他类似情况。 就像在尝试使用 AWS Lambda 函数(Python)解析推送到 s3 转发的 AWS SES 电子邮件时一样。 我不得不在这里提到它,因为我在尝试玩这些时也遇到了同样的问题。

在这种情况下像这样使用它

s3_file = object_s3['Body'].read()
mailobject = email.message_from_string(s3_file.decode('utf-8'),  policy=email.policy.default)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM