Чтение содержимого почты в файле 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

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

Ответ 1

Чтобы получить содержимое сообщения, вы хотите использовать 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)

Ответ 2

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

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

Ответ 3

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

  • обнаружение набора символов (с помощью content-encoding и chardet в случае, если он не работает)
  • Рекурсивный разбор парциального тела (вместо жестко заданного максимального уровня)
  • Игнорировать изображения и другие прикрепления
  • strip html with 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()