email.generator: Генерация MIME-документов¶email.generator: Generating MIME documents
Исходный код: Lib/email/generator.py
Одна из самых распространённых задач – создание плоской (сериализованной) версии email-сообщения, представленного структурой объекта сообщения. Это понадобится, если нужно отправить сообщение через smtplib.SMTP.sendmail() или модуль nntplib, или вывести сообщение на консоль. За создание сериализованного представления из структуры объекта сообщения отвечают классы генераторов.
Как и в случае с модулем email.parser, функциональность не ограничена встроенным генератором; можно написать свой с нуля. Однако встроенный генератор умеет создавать большинство писем в соответствии со стандартами, корректно обрабатывает как MIME-, так и не-MIME-сообщения и спроектирован так, что байт-ориентированные операции разбора и генерации являются обратными друг другу при условии использования одного и того же нетрансформирующего policy для обеих. То есть, разбор сериализованного байтового потока через класс BytesParser и последующая генерация сериализованного байтового потока с помощью BytesGenerator должны давать вывод, идентичный входному 1. (С другой стороны, использование генератора на объекте EmailMessage, созданном программно, может привести к изменениям объекта EmailMessage, так как заполняются значения по умолчанию.)
Класс Generator можно использовать для преобразования сообщения в текстовое (в отличие от двоичного) сериализованное представление, но поскольку Unicode не может напрямую представлять двоичные данные, сообщение неизбежно преобразуется в нечто, содержащее только символы ASCII, с использованием стандартных методов кодирования пересылки содержимого согласно RFC электронной почты для передачи по каналам, которые не являются «8-битно чистыми».
-
class
email.generator.BytesGenerator(outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)¶ Возвращает объект
BytesGenerator, который будет записывать любое сообщение, переданное методуflatten(), или любой текст, закодированный с surrogateescape, переданный методуwrite(), в объект, подобный файлу outfp. outfp должен поддерживать методwrite, принимающий двоичные данные.Если необязательный параметр mangle_from_ равен
True, перед каждой строкой тела сообщения, которая начинается с точной строки"From "(то есть сFromи следующего за ним пробела) ставится символ>. Параметр mangle_from_ по умолчанию принимает значение настройкиmangle_from_из policy (Trueдля политикиcompat32иFalseдля всех остальных). Параметр mangle_from_ предназначен для случая, когда сообщения хранятся в формате unix mbox (см.mailboxи раздел «ПОЧЕМУ ФОРМАТ CONTENT-LENGTH ПЛОХ»).Если maxheaderlen не равен
None, переформатировать любые строки заголовков, длиннее maxheaderlen, а если0, не переносить заголовки. Если manheaderlen равенNone(по умолчанию), переносить заголовки и другие строки сообщения в соответствии с настройками policy.Если указан policy, использовать эту политику для управления генерацией сообщений. Если policy равен
None(по умолчанию), использовать политику, связанную с объектомMessageилиEmailMessage, переданным вflatten, для управления генерацией сообщений. Подробнее о том, что контролирует policy, см. вemail.policy.Новое в версии 3.2.
Изменено в версии 3.3: Добавлен параметр policy.
Изменено в версии 3.6: Поведение по умолчанию параметров mangle_from_ и maxheaderlen теперь следует политике.
-
flatten(msg, unixfrom=False, linesep=None)¶ Выводит текстовое представление структуры объекта сообщения, корнем которой является msg, в выходной файл, указанный при создании экземпляра
BytesGenerator.Если опция
policycte_typeравна8bit(по умолчанию), копировать все заголовки в исходном разобранном сообщении, которые не были изменены, в вывод, воспроизводя любые байты с установленным старшим битом как в оригинале, и сохранять не-ASCII Content-Transfer-Encoding любых частей тела, имеющих его. Еслиcte_typeравен7bit, преобразовывать байты с установленным старшим битом по мере необходимости, используя совместимый с ASCII Content-Transfer-Encoding. То есть, преобразовывать части с не-ASCII Content-Transfer-Encoding (Content-Transfer-Encoding: 8bit) в совместимый с ASCII Content-Transfer-Encoding, и кодировать недопустимые по RFC не-ASCII байты в заголовках, используя набор символов MIMEunknown-8bit, делая их таким образом соответствующими RFC.Если unixfrom равно
True, печатать разделитель заголовка конверта, используемый форматом почтовых ящиков Unix (см.mailbox), перед первым из заголовков RFC 5322 корневого объекта сообщения. Если корневой объект не имеет заголовка конверта, сформировать стандартный. По умолчаниюFalse. Обратите внимание, что для подчастей заголовок конверта никогда не печатается.Если linesep не равно
None, использовать его как символ-разделитель между всеми строками сериализованного сообщения. Если linesep равноNone(по умолчанию), использовать значение, указанное в policy.
-
clone(fp)¶ Возвращает независимую копию этого экземпляра
BytesGeneratorс точно такими же настройками параметров и fp в качестве нового outfp.
-
write(s)¶ Кодирует s, используя кодек
ASCIIи обработчик ошибокsurrogateescape, и передаёт его методу write объекта outfp, переданного конструкторуBytesGenerator.
-
Для удобства EmailMessage предоставляет методы as_bytes() и bytes(aMessage) (также известный как __bytes__()), которые упрощают генерацию сериализованного двоичного представления объекта сообщения. Подробнее см. email.message.
Поскольку строки не могут представлять двоичные данные, класс Generator должен преобразовывать любые двоичные данные в любом сообщении, которое он формирует, в формат, совместимый с ASCII, преобразуя их в совместимое с ASCII Content-Transfer-Encoding. Используя терминологию RFC электронной почты, это можно рассматривать как сериализацию Generator в поток I/O, который не является «8-битно чистым». Другими словами, большинству приложений следует использовать BytesGenerator, а не Generator.
-
class
email.generator.Generator(outfp, mangle_from_=None, maxheaderlen=None, *, policy=None)¶ Возвращает объект
Generator, который будет записывать любое сообщение, переданное методуflatten(), или любой текст, переданный методуwrite(), в объект, подобный файлу outfp. outfp должен поддерживать методwrite, принимающий строковые данные.Если необязательный параметр mangle_from_ равен
True, перед каждой строкой тела сообщения, которая начинается с точной строки"From "(то есть сFromи следующего за ним пробела) ставится символ>. Параметр mangle_from_ по умолчанию принимает значение настройкиmangle_from_из policy (Trueдля политикиcompat32иFalseдля всех остальных). Параметр mangle_from_ предназначен для случая, когда сообщения хранятся в формате unix mbox (см.mailboxи раздел «ПОЧЕМУ ФОРМАТ CONTENT-LENGTH ПЛОХ»).Если maxheaderlen не равен
None, переформатировать любые строки заголовков, длиннее maxheaderlen, а если0, не переносить заголовки. Если manheaderlen равенNone(по умолчанию), переносить заголовки и другие строки сообщения в соответствии с настройками policy.Если указан policy, использовать эту политику для управления генерацией сообщений. Если policy равен
None(по умолчанию), использовать политику, связанную с объектомMessageилиEmailMessage, переданным вflatten, для управления генерацией сообщений. Подробнее о том, что контролирует policy, см. вemail.policy.Изменено в версии 3.3: Добавлен параметр policy.
Изменено в версии 3.6: Поведение по умолчанию параметров mangle_from_ и maxheaderlen теперь следует политике.
-
flatten(msg, unixfrom=False, linesep=None)¶ Выводит текстовое представление структуры объекта сообщения, корнем которой является msg, в выходной файл, указанный при создании экземпляра
Generator.Если опция
policycte_typeравна8bit, генерировать сообщение так, как если бы опция была установлена в7bit. (Это необходимо, потому что строки не могут представлять не-ASCII байты.) Преобразовывать любые байты с установленным старшим битом по необходимости, используя совместимую с ASCII Content-Transfer-Encoding. То есть преобразовывать части с не-ASCII Content-Transfer-Encoding (Content-Transfer-Encoding: 8bit) в совместимую с ASCII Content-Transfer-Encoding, и кодировать не соответствующие RFC не-ASCII байты в заголовках, используя набор символов MIMEunknown-8bit, тем самым делая их соответствующими RFC.Если unixfrom равно
True, печатать разделитель заголовка конверта, используемый форматом почтовых ящиков Unix (см.mailbox), перед первым из заголовков RFC 5322 корневого объекта сообщения. Если корневой объект не имеет заголовка конверта, сформировать стандартный. По умолчаниюFalse. Обратите внимание, что для подчастей заголовок конверта никогда не печатается.Если linesep не равно
None, использовать его как символ-разделитель между всеми строками сериализованного сообщения. Если linesep равноNone(по умолчанию), использовать значение, указанное в policy.Изменено в версии 3.2: Добавлена поддержка перекодировки тел сообщений
8bitи аргумента linesep.
-
Для удобства EmailMessage предоставляет методы as_string() и str(aMessage) (также известный как __str__()), которые упрощают создание форматированного строкового представления объекта сообщения. Подробнее см. email.message.
Модуль email.generator также предоставляет производный класс DecodedGenerator, который похож на базовый класс Generator, за исключением того, что части не типа text не сериализуются, а вместо этого представляются в выходном потоке строкой, полученной из шаблона, заполненного информацией о части.
-
class
email.generator.DecodedGenerator(outfp, mangle_from_=None, maxheaderlen=None, fmt=None, *, policy=None)¶ Работает как
Generator, за исключением того, что для любой подчасти сообщения, переданной вGenerator.flatten(), если подчасть имеет основной тип text, выводится декодированное содержимое подчасти, а если основной тип не text, то вместо вывода заполняется строка fmt с использованием информации из части и выводится полученная заполненная строка.Чтобы заполнить fmt, выполните
fmt % part_info, гдеpart_info– это словарь, состоящий из следующих ключей и значений:type– полный MIME-тип части не-textmaintype– основной MIME-тип части не-textsubtype– подтип MIME части не-textfilename– имя файла части не-textdescription– описание, связанное с частью не-textencoding– кодировка передачи содержимого части не-text
Если fmt равно
None, используйте следующий fmt по умолчанию:“[Часть сообщения не текстового типа (%(type)s) пропущена, имя файла %(filename)s]”
Необязательные _mangle_from_ и maxheaderlen такие же, как в базовом классе
Generator.
Сноски
- 1
Данное утверждение предполагает, что используются соответствующие настройки для
unixfromи что нет настроекpolicy, требующих автоматической корректировки (например,refold_sourceдолжно бытьnone, что не является значением по умолчанию). Это также не совсем верно, поскольку если сообщение не соответствует стандартам RFC, иногда информация о точном исходном тексте теряется при восстановлении после ошибок синтаксического разбора. Цель – исправить эти последние крайние случаи, когда это возможно.