В составном электронном письме email.message.Message.get_payload()
возвращает список с одним элементом для каждой части. Самый простой способ - пройтись по сообщению и получить полезную нагрузку для каждой части:
import email
msg = email.message_from_string(raw_message)
for part in msg.walk():
# each part is a either non-multipart, or another multipart message
# that contains further parts... Message is organized like a tree
if part.get_content_type() == 'text/plain':
print part.get_payload() # prints the raw text
Для сообщений, не состоящих из нескольких частей, нет необходимости выполнять все прогулки. Вы можете перейти прямо к get_payload (), независимо от content_type.
msg = email.message_from_string(raw_message)
msg.get_payload()
Если содержимое закодировано, вам нужно передать None
в качестве первого параметра в get_payload()
, а затем True (флаг декодирования является вторым параметром). Например, предположим, что моя электронная почта содержит вложение документа MS Word:
msg = email.message_from_string(raw_message)
for part in msg.walk():
if part.get_content_type() == 'application/msword':
name = part.get_param('name') or 'MyDoc.doc'
f = open(name, 'wb')
f.write(part.get_payload(None, True)) # You need None as the first param
# because part.is_multipart()
# is False
f.close()
Что касается получения разумного простого текста HTML-части, я обнаружил, что html2text работает чертовски хорошо.