0

我想在 Python 中解码'quoted-printable' 编码的字符串,但我似乎被困在一个点上。

我根据以下代码从我的 gmail 帐户中获取某些邮件:

import imaplib
import email
import quopri


mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('mail@gmail.com', '*******')
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)
.
.
.

'to'例如,如果我打印,如果 'to' 具有 é、á、ó 等字符,则结果是这样的:

=?UTF-8?B?UMOpdGVyIFBldMWRY3o=?=

我可以使用quopribody成功解码 ' ' 带引号的可打印编码字符串,如下所示:

quopri.decodestring(sometext).decode('utf-8') 

但是相同的逻辑不适用于电子邮件的其他部分,例如收件人、发件人、主题。

有人知道提示吗?

4

3 回答 3

0

这解决了它:

from email.header import decode_header
      def mail_header_decoder(header):
            if header != None:
                mail_header_decoded = decode_header(header)
                l=[]  
                header_new=[]
                for header_part in mail_header_decoded: 
                    l.append(header_part[1])

                if all(item == None for item in l):
                    # print(header)
                    return header
                else:
                    for header_part in mail_header_decoded:
                        header_new.append(header_part[0].decode())
                    header_new = ''.join(header_new) # convert list to string
                    # print(header_new)
                    return header_new
于 2018-11-28T21:43:03.947 回答
0

您正在尝试使用 utf-8 解码拉丁字符。你得到的输出是base64。上面写着:

找不到可打印的字符,尝试其他源字符集,或将您的数据作为文件上传以进行二进制解码。

试试这个。 Python:从 ISO-8859-1/latin1 转换为 UTF-8

于 2018-11-27T18:15:02.377 回答
0

您拥有的主题字符串不是纯带引号的可打印编码(即不是标准quopri的) - 它是可打印base64 带引号的混合。您可以使用标准库对其进行解码:

from email.header import decode_header

result = decode_header('=?UTF-8?B?UMOpdGVyIFBldMWRY3o=?=')
# ^ the result is a list of tuples of the form [(decoded_bytes, encoding),]

for data, encoding in result:
    print(data.decode(encoding))
    # outputs: Péter Petőcz
于 2022-02-22T20:56:34.653 回答