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"), ("", "us–ascii")])
msg["To"] = mkh([("Друг2", "koi8–r"), ("", "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"), ("", "us–ascii")])
=?koi8–r?b?5NLVxw==?=
>>> print make_header([(u"Друг", ""), ("", "us–ascii")])
=?utf–8?b?w6TDksOVw4c=?=
Функция 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'
.
Читать дальше
Конец ознакомительного отрывка
Купить книгу