簡體   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