[英]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_body
和get_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.