email.generator: Генерация MIME-документов
Исходный код: Lib/email/generator.py
Одна из самых распространенных задач — сгенерировать плоскую (сериализованную) версию сообщения электронной почты, представленного в виде структуры объекта сообщения. Вам потребуется сделать это, если вы хотите отправить сообщение через 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и WHY THE CONTENT-LENGTH FORMAT IS BAD).Если 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 (см.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 сериализует в поток ввода-вывода, который не является «чистым 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и WHY THE CONTENT-LENGTH FORMAT IS BAD).Если maxheaderlen не
None, переформатировать любые строки заголовка, которые длиннее maxheaderlen, или если0, не переформатировать любые заголовки. Если maxheaderlen равно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 Cotnent-Transfer-Encoding (Content-Transfer-Encoding: 8bit) в ASCII-совместимый Content-Transfer-Encoding и закодировать не-ASCII байты в заголовках, не соответствующие RFC, с использованием MIME набора символовunknown-8bit, тем самым, сделав их RFC-совместимыми.Если unixfrom
True, вывести разделитель заголовка конверта, используемый в формате почтового ящика Unix (см.mailbox), перед первым из заголовков RFC 5322 корневого объекта сообщения. Если у корневого объекта нет заголовка конверта, создать стандартный. По умолчаниюFalse. Обратите внимание, что для подчастей заголовок конверта никогда не выводится.Если linesep не
None, использовать его в качестве разделителя между всеми строками уплощенного сообщения. Если linesepNone(значение по умолчанию), использовать значение, заданное в policy.Изменено в версии 3.2: Добавлена поддержка повторного кодирования
8bitтел сообщений и аргумент linesep.
-
clone(fp) -
Возвращает независимую копию этого экземпляра
Generatorс точно такими же параметрами и fp в качестве нового outfp.
-
Для удобства, EmailMessage предоставляет методы as_string() и str(aMessage) (также известный как __str__()), которые упрощают генерацию форматированного строкового представления объекта сообщения. Подробнее см. в email.message.
Модуль email.generator также предоставляет производный класс DecodedGenerator, который похож на базовый класс Generator, за исключением того, что части, не являющиеся текстовыми, не сериализуются, а вместо этого представляются в потоке вывода строкой, полученной из шаблона, заполненного информацией о части.
-
class email.generator.DecodedGenerator(outfp, mangle_from_=None, maxheaderlen=None, fmt=None, *, policy=None) -
Действуют как
Generator, за исключением того, что для любой подчасти сообщения, переданной вGenerator.flatten(), если подчасть имеет основной тип текст, вывести декодированную полезную нагрузку подчасти, а если основной тип не текст, вместо вывода заполнить строку fmt информацией из части и вывести полученную заполненную строку.Для заполнения fmt выполните
fmt % part_info, гдеpart_infoэто словарь, составленный из следующих ключей и значений:-
type– Полный MIME-тип части, не являющейся текстом -
maintype– Основной MIME-тип части, не являющейся текстом -
subtype– Подтип MIME части, не являющейся текстом -
filename– Имя файла части, не являющейся текстом -
description– Описание, связанное с частью, не являющейся текстом -
encoding– Кодировка передачи содержимого части, не являющейся текстом
Если fmt
None, использовать следующий по умолчанию fmt:“[Нетекстовая (%(type)s) часть сообщения опущена, имя файла %(filename)s]”
Необязательные параметры _mangle_from_ и maxheaderlen такие же, как и у базового класса
Generator. -
Примечания
-
1 -
Это утверждение предполагает, что вы используете соответствующие настройки для
unixfrom, и что нет настроекpolicy, вызывающих автоматические корректировки (например,refold_sourceдолжно бытьnone, что не является значением по умолчанию). Также это не 100% верно, так как если сообщение не соответствует стандартам RFC, иногда информация о точном исходном тексте теряется во время восстановления от ошибок разбора. Цель — исправить эти крайние случаи, когда это возможно.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/email.generator.html