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