Парсинг многочастных писем в python и сохранение вложений - PullRequest
10 голосов
/ 06 июня 2011

Я довольно новичок в python и пытаюсь проанализировать электронную почту из gmail через imaplib и электронную почту python. Это работает довольно хорошо, но у меня есть проблемы с вложениями электронной почты.

Я хотел бы проанализировать весь открытый текст из электронного письма, игнорируя при этом любой HTML-код, который может быть вставлен как дополнительный тип контента, а также удаляя и сохраняя все другие вложения. Я пробовал следующее:

...imaplib connection and mailbox selection...

typ, msg_data = c.fetch(num, '(RFC822)')
        email_body = msg_data[0][1]
mail = email.message_from_string(email_body)
        for part in mail.walk():
            if part.get_content_type() == 'text/plain':
                body = body + '\n' + part.get_payload()
            else:
                continue

Это была моя первоначальная попытка просто взять текстовые части электронного письма, но когда кто-то отправляет электронное письмо с текстовым вложением, содержимое текстового файла отображается выше для переменной body.

Может кто-нибудь сказать мне, как я могу извлечь текстовые части письма, игнорируя при этом вторичный HTML, который иногда присутствует, и сохраняя все другие типы файловых вложений в виде файлов? Я прошу прощения, если это не имеет большого смысла. Я уточню вопрос с дополнительными разъяснениями, если это необходимо.

1 Ответ

12 голосов
/ 07 июня 2011

Если вам просто нужно сохранить текстовые вложения вне переменной body с тем, что у вас есть, это должно быть так просто:

mail = email.message_from_string(email_body)
    for part in mail.walk():
        c_type = part.get_content_type()
        c_disp = part.get('Content-Disposition')

        if c_type == 'text/plain' and c_disp == None:
            body = body + '\n' + part.get_payload()
        else:
            continue

Тогда, если Content-Disposition указывает, что этовложение, вы должны иметь возможность использовать part.get_filename() и part.get_payload() для обработки файла.Я не знаю, может ли что-то измениться, но это в основном то, что я использовал в прошлом для взаимодействия с моим почтовым сервером.

...