Пробелы заменены на = 20 после извлечения текста из электронной почты - PullRequest
2 голосов
/ 15 февраля 2020

Я пытался получить текст полученного gmail, используя модули электронной почты и imaplib в python. После декодирования с использованием utf-8 и получения полезной нагрузки сообщения все пробелы все еще заменяются на = 20. Могу ли я использовать другой шаг декодирования, чтобы исправить это?

Код следующий: (Я получил его из учебника YouTube - https://youtu.be/Jt8LizzxkPU)

``

import email
import imaplib



username = "abc"
password = "123"

mail = imaplib.IMAP4_SSL("imap.gmail.com")
mail.login(username,password)

mail.select("inbox")

result, data = mail.uid("search", None,"ALL")

inbox_item_list = data[0].split()

for item in inbox_item_list:
    #most_recent = inbox_item_list[-1]
    #oldest = inbox_item_list[0]

    result2, email_data = mail.uid('fetch',item,'(RFC822)') 

    raw_email = email_data[0][1].decode("utf-8")

    email_message = email.message_from_string(raw_email)

    to_ = email_message['To']
    from_ = email_message['From']
    subject_ = email_message['Subject']

    counter = 1
    for part in email_message.walk():
        if part.get_content_maintype() == "multipart":
            continue
        filename = part.get_filename()
        if not filename:
            ext = ".html"
            filename = "msg-part-%08d%s" %(counter, ext)
        counter += 1   

    #save file
    content_type = part.get_content_type()
    print(subject_)
    print (content_type)
    if "plain" in content_type:
        print(part.get_payload())
    elif "html" in content_type:
        print("do some beautiful soup")
    else:
        print(content_type)

``

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Попробуйте import quopri, а затем, когда вы получите содержимое тела письма (или любой другой текст, который содержит = 20 с), вы можете использовать quopri.decodestring()

Я делаю это как

quopri.decodestring(part.get_payload())

Но имейте в виду, что это, если вы совершенно определенно хотите декодировать с quoted-printable. Обычно я бы сказал, что ответ @jfs выше - аккуратнее.

1 голос
/ 16 февраля 2020

Вот полный пример кода того, как простое электронное письмо (которое содержит как литерал =20, так и =20 последовательность, которая должна быть заменена пробелом) может быть декодировано:

#!/usr/bin/env python3
import email.policy

email_text = """Subject: =?UTF-8?B?dGVzdCDwn5OnID0yMA==?=
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo=
oooooooooooooooooooooooooooooong=20word
=3D20
^ line starts with =3D20
emoji: <=F0=9F=93=A7>"""
msg = email.message_from_string(
    email_text, policy=email.policy.default
)
print("Subject: <{subject}>".format_map(msg))
assert not msg.is_multipart()
print(msg.get_content())

Выходные данные

Subject: <test ? =20>
loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
=20
^ line starts with =20
emoji: <?>

msg.walk(), part.get_payload(decode=True) могут использоваться для прохождения более сложных EmailMessage объектов. См. email Примеры .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...