Вход/Регистрация
Язык программирования Python
вернуться

Сузи Роман Арвиевич

Шрифт:

>>> msg.is_multipart

False

или список полей:

Листинг

>>> print msg.keys

['Received', 'Received', 'Message–ID', 'Date', 'From', 'User–Agent',

'MIME–Version', 'To', 'Subject', 'Content–Type',

'Content–Transfer–Encoding', 'Spam', 'X–Spam']

Так как сообщение состоит из одной части, можно получить его тело в виде строки:

Листинг

>>> print msg.get_payload

sorgeloosheid hullw ifesh nozama decompresssequenceframes

Believe it or not, I have tried several sites to b»_«uy presription

medication. I should say that currently you are still be the best amony

…

Теперь будет рассмотрен другой пример, в котором сообщение состоит из нескольких частей. Это сообщение порождено вирусом. Оно состоит из двух частей: HTML–текста и вложенного файла с расширением cpl. Для доступа к частям сообщения используется метод walk, который обходит все его части. Попутно следует собрать типы содержимого (в списке parts), поля Content–Type (в ct_fields) и имена файлов (в filenames):

Листинг

import email

parts = []

ct_fields = []

filenames = []

f = open(«virus.eml»)

msg = email.message_from_file(f)

for submsg in msg.walk:

parts.append(submsg.get_content_type)

ct_fields.append(submsg.get('Content–Type', ''))

filenames.append(submsg.get_filename)

if submsg.get_filename:

print «Длина файла:", len(submsg.get_payload)

f.close

print parts

print ct_fields

print filenames

В результате получилось:

Листинг

Длина файла: 31173

['multipart/mixed', 'text/html', 'application/octet–stream']

['multipart/mixed;\n boundary=" — — — — hidejpxkblmvuwfplzue»',

'text/html; charset=«us–ascii»',

'application/octet–stream; name=«price.cpl»']

[None, None, 'price.cpl']

Из списка parts можно увидеть, что само сообщение имеет тип multipart/mixed, тогда как две его части — text/html и application/octet–stream соответственно. Только с последней частью связано имя файла (price.cpl). Файл читается методом get_payload и вычисляется его длина.

Кстати, в случае, когда сообщение является контейнером для других частей, get_payload выдает список объектов–сообщений (то есть экземпляров класса Message).

Формирование сообщения

Часто возникает ситуация, когда нужно сформировать сообщение с вложенным файлом. В следующем примере строится сообщение с текстом и вложением. В качестве класса для порождения сообщения можно использовать не только Message из модуля email.Message, но и MIMEMultipart из email.MIMEMultipart (для сообщений из нескольких частей), MIMEImage (для сообщения с графическим изображением), MIMEAudio (для аудиофайлов), MIMEText (для текстовых частей):

Листинг

# Загружаются необходимые модули и функции из модулей

from email.Header import make_header as mkh

from email.MIMEMultipart import MIMEMultipart

from email.MIMEText import MIMEText

from email.MIMEBase import MIMEBase

from email.Encoders import encode_base64

# Создается главное сообщение и задаются некоторые поля

msg = MIMEMultipart

msg[«Subject»] = mkh([(«Привет», «koi8–r»)])

msg[«From»] = mkh([(«Друг», «koi8–r»), ("<friend@mail.ru>", «us–ascii»)])

msg[«To»] = mkh([(«Друг2», «koi8–r»), ("<friend2@yandex.ru>", «us–ascii»)])

# То, чего будет не видно, если почтовая программа поддерживает MIME

msg.preamble = «Multipart message»

msg.epilogue = ""

# Текстовая часть сообщения

text = u»"«К письму приложен файл с архивом.»"".encode(«koi8–r»)

to_attach = MIMEText(text, _charset=«koi8–r»)

msg.attach(to_attach)

# Прикладывается файл

fp = open(«archive_file.zip», «rb»)

to_attach = MIMEBase(«application», «octet–stream»)

to_attach.set_payload(fp.read)

encode_base64(to_attach)

to_attach.add_header(«Content–Disposition», «attachment»,

filename=«archive_file.zip»)

fp.close

msg.attach(to_attach)

print msg.as_string

В этом примере видно сразу несколько модулей пакета email. Функция make_header из email.Header позволяет закодировать содержимое для заголовка:

Листинг

>>> from email.Header import make_header

  • Читать дальше
  • 1
  • ...
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: