Язык программирования Python

       

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


Часто возникает ситуация, когда нужно сформировать сообщение с вложенным файлом. В следующем примере строится сообщение с текстом и вложением. В качестве класса для порождения сообщения можно использовать не только 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').


Содержание раздела