首页 > 解决方案 > Python 无法正确读取来自少数电子邮件域(例如 hotmail)的响应

问题描述

我在使用 Python 从 Outlook 阅读电子邮件时遇到了一些问题。不知何故,内容要么被加密,要么被转换为原始电子邮件中的字节码;但是,如果使用 gmail 读取相同的电子邮件,则响应将显示为普通文本。

不幸的是,我无法分享这封电子邮件,但是这就是我正在使用的内容,也许它可以帮助您为我指明正确的方向。

我正在尝试阅读我的 gmail 帐户电子邮件回复。为此,我正在使用:来自 python 的 imapclient 和 email.parser 包。我的进口:

import pyzmail
from imapclient import IMAPClient
import logging
from datetime import datetime
from email.parser import Parser
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import decode_header

使用以下代码,我能够成功解析电子邮件,例如发件人、回复日期、主题和正文。

parser = Parser()
emailMsg = parser.parsestr(msg)
pdict = {}
pdict['From'] = emailMsg.get('From').strip()
pdict['ResponseDate'] = emailMsg.get('Date').strip()
#pdict['To'] = emailMsg.get('To').strip()
logging.info("Email Send From: "+pdict['From'])
pdict['Subject']= parseSubject(emailMsg.get('Subject').strip())
if emailMsg.is_multipart():
    pdict['Response'] = getMultiPartResponse(emailMsg.get_payload()[0].as_string())
else:
    pdict['Response'] = getSinglePartResponse(emailMsg.get_payload())
return(pdict)

这样做我可以解析大部分响应,但是我注意到如果最终用户使用的是微软电子邮件,尤其是 hotmail;电子邮件的原始消息被加密或转换为字节码。因此 python 电子邮件解析器返回一些加密字符串。然而,在 Gmail 客户端上,这些邮件被视为普通邮件。

例如,我正在阅读关于 gmail 的回复:

Thank You.

但是 Python 代码解析为:

WUVTDQoNCj4gT24gRGVjIDE2LCAyMDIwLCBhdCAxMjo1MyBQTSwgSGVhbGluZyBUb3VjaCBSZWhh YmlsaXRhdGlvbiBDZW50cmUgPGluZm8uaHRyY0BnbWFpbC5jb20+IHdyb3RlOg0KPiANCj4g77u/

有没有其他人遇到过这个问题?

到目前为止,我只从 hotmail 域电子邮件中注意到这些问题,所有其他域 python 程序都能够成功读取消息。

我不确定 hotmail 是否使用了一些特殊的加密,需要在代码级别注意将响应转换为普通文本。电子邮件的所有其他属性都可以正确读取,但电子邮件正文除外。

任何帮助,将不胜感激。

谢谢你。

标签: pythonpython-3.xemail

解决方案


字符串

"WUVTDQoNCj4gT24gRGVjIDE2LCAyMDIwLCBhdCAxMjo1MyBQTSwgSGVhbGluZyBUb3VjaCBSZWhh YmlsaXRhdGlvbiBDZW50cmUgPGluZm8uaHRyY0BnbWFpbC5jb20+IHdyb3RlOg0KPiANCj4g77u/"

base64编码的数据。可以像这样对消息进行编码,以使只能处理 ASCII 文本的服务器能够处理非 ASCII 文本。可以使用标准库中base64模块中的工具对其进行解码,如下所示:

import base64
s = base64.b64decode('WUVTDQoNCj4gT24gRGVjIDE2LCAyMDIwLCBhdCAxMjo1MyBQTSwgSGVhbGluZyBUb3VjaCBSZWhh YmlsaXRhdGlvbiBDZW50cmUgPGluZm8uaHRyY0BnbWFpbC5jb20+IHdyb3RlOg0KPiANCj4g77u/')

结果是一个字节实例

b'YES\r\n\r\n> On Dec 16, 2020, at 12:53 PM, Healing Touch Rehabilitation Centre <info.htrc@gmail.com> wrote:\r\n> \r\n> \xef\xbb\xbf

如果已在电子邮件上正确设置了内容传输编码标头,则调用

emailMsg.get_payload(decode=True)

应该执行解码,如果emailMsg.is_multipart()False。如果emailMsg.is_multipart()是,True那么您需要调用get_payload每个部分。

与“新”电子邮件 API(Python 3.6+)一起提供的EmailMessage类提供了一个get_content方法,该方法将自动解码(假设正确的标头到位) - 请参阅此答案以获取示例。


推荐阅读