我正在使用Python脚本来获取人们在我的电子邮件地址上发送的邮件。
我正在使用ImapClient模块,并且得到了电子邮件的内容,但原型很奇怪,我所有的UTF-8字符都经过编码,如下所示:
否= C3 = AB1
这是我的代码:
email_message = email.message_from_bytes(message_data[b'RFC822'])
print(email_message.get_payload(0))
我也尝试decode=True
在我的参数中添加参数get_payload
,但是返回了一个NoneType
。
您必须首先确定您感兴趣的电子邮件部分。然后,根据该部分的编码对该部分的内容进行解码。每个部分可以具有不同的编码和/或字符集。如果您对电子邮件的主体感兴趣,通常这是第一部分,可以是html或纯文本,具体取决于发送电子邮件的程序(某些用户代理(例如gmail)将同时包含这两种形式) )。
您可以在邮件对象上使用电子邮件模块的EmailMessage.walk()函数来查看各种附件及其各自的内容类型。这些部分之间用特殊的“边界”字符串(通常是随机的)分隔开,该字符串不在消息正文中出现(为避免歧义)。让电子邮件模块为您遍历零件更容易-尤其是因为零件可以嵌套。
您在问题中显示的文本片段似乎是带引号的可编码编码。您可以在此处找到从quoted-printable到utf-8的转换示例:将“ Quoteed-printable”编码更改为“ utf-8”
一个例子:
我在下面添加一个示例模拟原始消息,该消息将代表构成EmailMessage对象的字节。在电子邮件中,每个部分/部分(主体,附件等)可以具有不同的内容类型,字符集和传输编码。零件可以嵌入子零件,但是电子邮件通常通常只有一个平面结构。对于作为附件的零件,通常会找到一个content-disposition值,该值将指示文件内容的建议文件名。
Subject: Woah
From: "Sébastien" <[email protected]>
To: Bob <[email protected]>
Content-Type: multipart/alternative; boundary="000000000000690fec05765c6a66"
--000000000000690fec05765c6a66
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
S=C3=A9bastien est un pr=C3=A9nom.
--000000000000690fec05765c6a66
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div di=
r=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"lt=
r"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><div=
dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr">...
...
选择了感兴趣的部分后,您必须使用该部分的编码设置来正确转换有效负载。您首先要撤消任何传输编码(例如,quoted-printable),然后根据字符集对结果字符串进行解码。
如果您想要的部分的字符集已经存在UTF-8
,那么您要做的就是撤消content-transfer-encoding(例如,删除带引号的可打印序列)。但是,如果部分的字符集不同,例如Latin-1,则必须从字节转到unicode,然后再从unicode转到utf8:
# remove quoted-printable encoding
unquoted = quopri.decodestring(mime_part_payload)
# latin-1 in this case is the charset of the mime part header
tmp_unicode = unquoted.decode('latin-1', errors='ignore')
# encode to desired encoding
u8 = tmp_unicode.encode('utf-8')
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句