Python Imap: как разобрать многочастный почтовый контент - PullRequest
4 голосов
/ 04 ноября 2010

Письмо может содержать различные блоки, такие как:

--0016e68deb06b58acf04897c624e
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
content_1
...

--0016e68deb06b58acf04897c624e
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
content_2
... and so on

Как я могу получить содержимое каждого блока с помощью Python?
А также, как получить свойства каждого блока? (тип контента и т. д.)

Ответы [ 3 ]

9 голосов
/ 04 ноября 2010

Для разбора электронных писем я использовал Message.walk() метод, подобный этому:

if msg.is_multipart():
    for part in msg.walk():
        ...

Для контента вы можете попробовать: part.get_payload(). Для типа контента есть: part.get_content_type()

Документацию вы найдете здесь: http://docs.python.org/library/email.message.html

Вы также можете попробовать email модуль с его итераторами.

2 голосов
/ 04 ноября 2010

http://docs.python.org/library/email.html

Очень простой пример (msg_as_str содержит необработанные байты, полученные с сервера imap):

import email
msg = email.message_from_string(msg_as_str)
print msg["Subject"]
1 голос
/ 29 ноября 2018

Я написал этот код. Вы можете использовать его, если вам это нравится для анализа многочастного контента:

if mime_msg.is_multipart():
        for part in mime_msg.walk():
            if part.is_multipart():
                for subpart in part.get_payload():
                    if subpart.is_multipart():
                        for subsubpart in subpart.get_payload():
                            body = body + str(subsubpart.get_payload(decode=True)) + '\n'
                    else:
                        body = body + str(subpart.get_payload(decode=True)) + '\n'
            else:
                body = body + str(part.get_payload(decode=True)) + '\n'
else:
    body = body + str(mime_msg.get_payload(decode=True)) + '\n'

body = bytes(body,'utf-8').decode('unicode-escape')

А если вы хотите вывести в виде простого текста, то конвертируйте тело в html2text.HTML2Text()

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