нерекурсивный просмотр сообщения электронной почты из сообщения почтового ящика - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь работать с сообщениями электронной почты в Python 3.7 и пытаюсь решить проблемы совместимости.В документах упоминается, что email.message.Message имеет метод iter_parts, который должен позволять мне выполнять нерекурсивный обход частей сообщения.

Это не существует в сообщениях, возвращаемых из сообщений mailbox, и оно забрало менянекоторое время, чтобы заставить его вести себя.Например, я могу сгенерировать фиктивное сообщение с:

from email.message import EmailMessage

msg = EmailMessage()
msg['Subject'] = 'msg 1'
msg.add_alternative("Plain text body", subtype='plain')
msg.add_alternative("<html><body><p>HTML body</p></body></html>", subtype='html')
msg.add_attachment(b"Nothing to see here!", maintype='data', subtype='raw')

, а затем выгрузить детали с помощью:

def iter_parts(msg):
  ret = msg.get_content_type()
  if msg.is_multipart():
    parts = ', '.join(iter_parts(m) for m in msg.iter_parts())
    ret = f'{ret} [{parts}]'
  return ret

iter_parts(msg)

, что даст мне: multipart/mixed [multipart/alternative [text/plain, text/plain], data/raw]

но если я сохраню это в файл mbox и перезагрузлю его:

import mailbox
mbox = mailbox.mbox('/tmp/test.eml')
mbox.add(msg)
iter_parts(mbox[0])

он скажет мне AttributeError: 'mboxMessage' object has no attribute 'iter_parts'

Сначала я подумал, что это может быть связано с https://stackoverflow.com/a/45804980/1358308, но с настройкойfactory=None, похоже, мало что делает в Python 3.7.

Я публикую свое решение, но хотел бы знать, есть ли лучшие варианты!

1 Ответ

0 голосов
/ 24 сентября 2018

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

from email import policy
from email.parser import BytesParser

mbox = mailbox.mbox('/tmp/test.eml', factory=BytesParser(policy=policy.default).parse)

, а затем я получаю объекты методом iter_parts.

...