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