我有很多来自邮件正文的字符串,打印如下:
=C3=A9
例如,这应该是“é”。
这种编码到底是什么以及如何解码它?
我正在使用 python 3.5
EDIT:
我设法通过应用以下方法对邮件正文进行正确编码:
quopri.decodestring(sometext).decode('utf-8')
然而,我仍然很难让 FROM、TO、SUBJECT 等部分正确。
这就是我构建电子邮件的方式:
import imaplib
import email
import quopri
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('[email protected] /cdn-cgi/l/email-protection', '*******')
mail.list()
mail.select('"[Gmail]/All Mail"')
typ, data = mail.search(None, 'SUBJECT', '"{}"'.format('123456'))
data[0].split()
print(data[0].split())
for e_mail in data[0].split():
typ, data = mail.fetch('{}'.format(e_mail.decode()),'(RFC822)')
raw_mail = data[0][1]
email_message = email.message_from_bytes(raw_mail)
if email_message.is_multipart():
for part in email_message.walk():
if part.get_content_type() == 'text/plain':
if part.get_content_type() == 'text/plain':
body = part.get_payload()
to = email_message['To']
utf = quopri.decodestring(to)
text = utf.decode('utf-8')
print(text)
.
.
.
我仍然得到这个:=?UTF-8?B?UMOpdGVyIFBldMWRY3o=?=
这就是所谓的“引用打印”编码。它由 RFC 1521 定义。其目的是用一系列正常、安全的字符替换不寻常的字符值,以便电子邮件系统可以安全地处理消息。
事实上,这里有两个级别的编码。首先是信'é'
被编码为UTF-8,产生'\xc3\xa9'
,然后将 UTF-8 编码为可引用打印的形式'=C3=A9'
您可以使用以下命令撤消引用的可打印步骤decode
or decodestring
的方法quopri
模块,记录于https://docs.python.org/3/library/quopri.html https://docs.python.org/3/library/quopri.html那看起来像:
import quopri
source = '=C3=A9'
print(quopri.decodestring(source))
这将撤消引用的可打印编码并显示 UTF-8 字节'\xc3\xa9'
。回到这封信'é'
你需要使用decode
string 方法并告诉 Python 这些字节包含 UTF-8 编码,如下所示:
utf = quopri.decodestring(source)
text = utf.decode('utf-8')
print(text)
UTF-8 只是将字母编码为字节的多种可能方法之一。例如,如果您的'é'
已编码为 ISO-8859-1 它将具有字节值'\xe9'
其引用的可打印表示形式将是'=E9'
.
当您处理电子邮件时,您应该会看到内容类型标头告诉您正在发送的内容类型以及对邮件文本(或多部分邮件中的单个 MIME 部分)应用了哪种字母到字节编码。如果该文本随后通过应用引用打印编码再次编码,则该附加步骤应由内容传输编码标头。因此,您的带有 UTF-8 编码文本且以引用打印格式传输的消息应该具有如下所示的标头:
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)