Язык программирования Python
Шрифт:
Листинг
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']
Из
Кстати, в случае, когда сообщение является контейнером для других частей, 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
>>> print make_header([(«Друг», «koi8–r»), ("<friend@mail.ru>", «us–ascii»)])
=?koi8–r?b?5NLVxw==?= <friend@mail.ru>
>>> print make_header([(u»Друг», ""), ("<friend@mail.ru>", «us–ascii»)])
=?utf–8?b?w6TDksOVw4c=?= <friend@mail.ru>
Функция email.Encoders.encode_base64 воздействует на переданное ей сообщение и кодирует тело с помощью base64. Другие варианты: encode_quopri - кодировать quoted printable, encode_7or8bit - оставить семь или восемь бит. Эти функции добавляют необходимые поля.
Аргументы конструкторов классов из MIME–модулей пакета email:
Листинг
class MIMEBase(_maintype, _subtype, **_params)
Базовый класс для всех использующих MIME сообщений (подклассов Message). Тип содержимого задается через _maintype и _subtype.
Листинг
class MIMENonMultipart
Подкласс для MIMEBase, в котором запрещен метод attach, отчего он гарантированно состоит из одной части.
Листинг
class MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]])
Подкласс для MIMEBase, который является базовым для MIME–сообщений из нескольких частей. Главный тип multipart, подтип указывается с помощью _subtype.
Листинг
class MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])
Подкласс MIMENonMultipart. Используется для создания MIME–сообщений, содержащих аудио данные. Главный тип — audio, подтип указывается с помощью _subtype. Данные задаются параметром _audiodata.
Листинг
class MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])
Подкласс MIMENonMultipart. Используется для создания MIME–сообщений с графическим изображением. Главный тип — image, подтип указывается с помощью _subtype. Данные задаются параметром _imagedata.
Листинг
class MIMEMessage(_msg[, _subtype])
Подкласс MIMENonMultipart для класса MIMENonMultipart используется для создания MIME–объектов с главным типом message. Параметр _msg применяется в качестве тела и должен являться экземпляром класса Message или его потомков. Подтип задается с помощью _subtype, по умолчанию 'rfc822'.
Листинг
class MIMEText(_text[, _subtype[, _charset]])
Подкласс MIMENonMultipart. Используется для создания MIME–сообщений текстового типа. Главный тип — text, подтип указывается с помощью _subtype. Данные задаются параметром _text. Посредством _charset можно указать кодировку (по умолчанию 'us–ascii').
Разбор поля заголовка
В примере выше поле Subject формировалось с помощью email.Header.make_header. Разбор поля поможет провести другая функция: email.Header.decode_header. Эта функция возвращает список кортежей, в каждом из них указан кусочек текста поля и кодировка, в которой этот текст был задан. Следующий пример поможет понять суть дела: