[英]Trouble decoding email using gmail API
我很难让 python 阅读我的电子邮件。 我正在尝试从 email 的主体中提取信息。 我遇到的问题是,当我直接从原始源运行 email 上的代码时,即使在通过 base64 解码器运行它之后,它仍然返回不可读的 Z95A1446A7120E4AF5C0C8878ABB7E6D2 数据。 但是,如果我将相同的 email 转发给自己,那么代码将遍历转发的 email,它可以完美地工作并适当地解码整个 email。 这是我用来获取 email 主体的 function。 我注意到直接来自源的 content_type 是“文本”,但是当我将其转发给自己时,它会将其读取为“多部分”。 任何帮助是极大的赞赏。 我不知道从这里到 go 的位置。
提前致谢!
def get_message(service, user_id, msg_id):
try:
# Makes the connection and GETS the emails in RAW format.
message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
# Changes format from RAW to ASCII
msg_raw = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
# Changes format type again
msg_str = email.message_from_bytes(msg_raw)
# This line checks what the content is, if multipart (plaintext and html) or single part
content_types = msg_str.get_content_maintype()
print(content_types)
if content_types == 'multipart':
# Part1 is plaintext and part2 is html text
part1, part2 = msg_str.get_payload()
raw_email = part1.get_payload()
remove_char = ["|", "=20", "=C2=A0"]
for i in remove_char:
raw_email = raw_email.replace(i, "")
raw_email = "".join([s for s in raw_email.strip().splitlines(True) if s.strip()])
print('Inside correct part')
print(raw_email)
return str(raw_email)
else:
print('Inside the Else')
print(msg_str.get_payload())
return msg_str.get_payload()
except:
print('An error has occured during the get_message function.')
编辑:这是 function 从原始来源查看时打印出来的内容:
text
Inside the Else
PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy93M2MvL2R0ZCB4aHRtbCAxLjAgdHJhbnNpdGlvbmFs
Ly9lbiIgImh0dHA6Ly93d3cudzMub3JnL3RyL3hodG1sMS9kdGQveGh0bWwxLXRyYW5zaXRpb25h
bC5kdGQiPjxodG1sIHN0eWxlPSJtYXJnaW46IDA7cGFkZGluZzogMDtmb250LWZhbWlseTogJ0hl
bHZldGljYSBOZXVlJywgJ0hlbHZldGljYScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7
Plus about 100 lines of stuff like this.
如果我将其转发给自己,这是从同一个 email 打印出来的内容:
multipart
Inside correct part
---------- Forwarded message ---------
From: <originalSource@email.com>
Date: Wed, Jun 10, 2020 at 10:34 AM
Subject: You added cash to your Account
To: <xxxxxxxxxx@gmail.com>
[image: card] Account ending in XXXX
Hi, XXXX XXXX,
Success!
You added cash with
base64 会将数据解码为字符串,而不是字节。 因此你应该改变这个
msg_str = email.message_from_bytes(msg_raw)
为了这
msg_str = email.message_from_string(msg_raw)
查看 Python 中的此文档示例,了解有关此的更多信息。
我希望这对你有所帮助。 让我知道您是否需要其他任何内容,或者您是否不理解某些内容。 :)
Use Gmail documentation provided API for decoding https://www.tabnine.com/code/java/classes/com.google.api.client.util.Base64
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.