email.generator: Генерация MIME-документов
Исходный код: Lib/email/generator.py
Одной из наиболее распространённых задач является генерация плоской (сериализованной) версии сообщения электронной почты, представленного структурой объекта сообщения. Вам потребуется это сделать, если вы хотите отправить своё сообщение через smtplib.SMTP.sendmail() или модуль nntplib, или распечатать сообщение в консоли. Преобразование объекта сообщения в сериализованное представление выполняют классы-генераторы.
Как и с модулем email.parser, вы не ограничены функциональностью встроенного генератора; вы можете написать свой собственный. Однако встроенный генератор умеет генерировать большинство сообщений электронной почты в соответствии со стандартами, обрабатывает сообщения MIME и не-MIME без проблем, и разработан таким образом, что операции побайтового парсинга и генерации являются обратными, при условии, что используется тот же не преобразующий policy для обоих. То есть, разбор сериализованного байтового потока с помощью класса BytesParser и последующее воссоздание сериализованного байтового потока с помощью BytesGenerator должно дать результат, идентичный входному 1. (С другой стороны, использование генератора с объектом EmailMessage, созданным программно, может привести к изменениям в объекте EmailMessage, поскольку по умолчанию будут заполнены значения.)
Класс Generator может использоваться для преобразования сообщения в текстовое (в отличие от бинарного) сериализованное представление, но поскольку Unicode не может напрямую представлять двоичные данные, сообщение по необходимости преобразуется в формат, содержащий только символы ASCII, используя стандартные методы кодирования содержания email RFC для кодирования сообщений электронной почты для передачи по каналам, которые не являются «8-битными».
Для обеспечения воспроизводимой обработки подписанных SMIME сообщений Generator отключает укладку заголовков для частей сообщения типа multipart/signed и всех подчастей.
-
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, переупаковка заголовков не выполняется. Если maxheaderlen равноNone(значение по умолчанию), заголовки и другие строки сообщения форматируются в соответствии с настройками политики policy.Если указана policy, используется эта политика для управления генерацией сообщения. Если policy равно
None(значение по умолчанию), используется политика, связанная с объектомMessageилиEmailMessage, переданным методуflatten, для управления генерацией сообщения. Подробности о том, что контролирует policy, см. вemail.policy.New in version 3.2.
Changed in version 3.3: Добавлен ключевой параметр policy.
Changed in version 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, а не-ASCII байты в заголовках, которые не соответствуют RFC, кодируются с помощью набора символов MIMEunknown-8bit, делая их RFC-совместимыми.Если unixfrom равно
True, перед первой из строк заголовков RFC 5322 корневого объекта сообщения печатается разделитель заголовка конверта, используемый в формате Unix mailbox (см.mailbox). Если у корневого объекта нет заголовка конверта, создаётся стандартный. По умолчанию значение равно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, не переформатируйте никакие заголовки. Если 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 и кодирует не-ASCII байты, не соответствующие RFC, в заголовках с помощью набора символов MIMEunknown-8bitдля соответствия RFC.Если unixfrom равно
True, выводит разделитель заголовка конверта, используемый в формате почтовых ящиков Unix (см.mailbox) перед первым из заголовков RFC 5322 корневого объекта сообщения. Если у корневого объекта нет заголовка конверта, создается стандартный. По умолчаниюFalse. Обратите внимание, что для подчастей заголовок конверта никогда не выводится.Если linesep не
None, использует его в качестве разделителя между всеми строками сжатого сообщения. Если linesep равноNone(по умолчанию), использует значение, указанное в 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, и что нетemail.policyнастроек, требующих автоматической корректировки (например,refold_sourceдолжно бытьnone, что не является значением по умолчанию). Также это не на 100% верно, поскольку, если сообщение не соответствует стандартам RFC, иногда информация о точном исходном тексте теряется во время восстановления от ошибок разбора. Цель состоит в том, чтобы по возможности устранить эти крайние случаи.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/email.generator.html