Чтение содержимого почты файла mbox с помощью почтового ящика python

Я пытаюсь распечатать содержимое почты (тело почты) с помощью почтового ящика Python.

import mailbox

mbox = mailbox.mbox('Inbox')
i=1
for message in mbox:
    print i
    print "from   :",message['from']
    print "subject:",message['subject']
    print "message:",message['**messages**']
    print "**************************************" 
    i+=1

но я чувствую, что сообщение['сообщения'] не является правильным для печати содержимого почты здесь. Я не мог понять этого из документация

3 ответов


чтобы получить содержимое сообщения, вы хотите использовать get_payload(). mailbox.Message является наследником email.message.Message. Вы также захотите проверить is_multipart() потому что это повлияет на возвращаемое значение get_payload(). Пример:

if message.is_multipart():
    content = ''.join(part.get_payload(decode=True) for part in message.get_payload())
else:
    content = message.get_payload(decode=True)

def getbody(message): #getting plain text 'email body'
    body = None
    if message.is_multipart():
        for part in message.walk():
            if part.is_multipart():
                for subpart in part.walk():
                    if subpart.get_content_type() == 'text/plain':
                        body = subpart.get_payload(decode=True)
            elif part.get_content_type() == 'text/plain':
                body = part.get_payload(decode=True)
    elif message.get_content_type() == 'text/plain':
        body = message.get_payload(decode=True)
    return body

эта функция может дать вам тело сообщения.


вот более полный ответ с:

  • обнаружение кодировки (через content-encoding и chardet в случае, если он не работает)
  • рекурсивный разбор составных тел (вместо жестко закодированного максимального уровня)
  • игнорировать изображения и другие файлы
  • полоса html с beautifulsoup
  • разбор отправителей и приемников

.

import io, csv, email

from email import header
from email.utils import getaddresses

from bs4 import BeautifulSoup

import chardet

def mbox_to_csv(mbox):
    mail = None

    def add_mail():
        if mail:
            msg = email.message_from_string(mail)

            subject = header.make_header(header.decode_header(msg['Subject']))
            body = str(subject)

            body += '\n'

            def parse_payload(message):
                if message.is_multipart():
                    for part in message.get_payload(): 
                        yield from parse_payload(part)
                else:
                    yield message, message.get_payload(decode=True)

            for submsg, part in parse_payload(msg):
                content_type = submsg.get_content_type()
                content = ''
                def decode():
                    charset = submsg.get_content_charset('utf-8')
                    try:
                        return part.decode(charset)
                    except UnicodeDecodeError:
                        charset = chardet.detect(part)['encoding']
                        return part.decode(charset)
                if 'plain' in content_type:
                    content = decode()
                if 'html' in content_type:
                    content = BeautifulSoup(decode()).text
                body += '\n' + content

            senders = getaddresses(msg.get_all('from', []))

            tos = msg.get_all('to', [])
            ccs = msg.get_all('cc', [])
            resent_tos = msg.get_all('resent-to', [])
            resent_ccs = msg.get_all('resent-cc', [])
            all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)

    for line in mbox:
        if line.startswith('From '):
            add_mail()
            mail = ''
        if mail is not None: # ignore email without headers
            mail += line
    add_mail()