2014-10-25 4 views
6

Я пытаюсь распечатать содержимое почты (тело письма) с помощью почтового ящика Python.Чтение почтового содержимого файла mbox с использованием почтового ящика 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 

Но я чувствую сообщение [ «сообщений»] не является правильным, чтобы напечатать содержание почты здесь. Я не мог понять это из documentation

ответ

9

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

@ cpburnz Так что это что-то вроде http://pastebin.com/AcYvDQM9 Но это не сработало. :( – Technopolice

+0

@ Sidnext2none не работает * как *? –

+0

@cpburnz Вы должны, вероятно, использовать 'get_payload (decode = True)', если сообщение не является многочастным, чтобы удалить «Content-Transfer-Encoding» - иначе вы могли бы закончить с сообщением base64 или с кавычками. –

9
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 

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

+0

Как добавить поддержку для «multipart/alternative»? –

+0

Вы можете заменить content_type, – jOSe

1

Вот более полный ответ отличая:

  • обнаружения кодировок (через 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()