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 бит».
Для обеспечения воспроизводимой обработки подписанных 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и WHY THE CONTENT-LENGTH FORMAT IS BAD).Если maxheaderlen не равно
None, переформатировать любые строки заголовков, длина которых превышает maxheaderlen, или если0, не переупаковывать любые заголовки. Если maxheaderlen равноNone(по умолчанию), заголовки и другие строки сообщения форматируются в соответствии с параметрами политики policy.Если указана политика policy, используйте её для управления генерацией сообщения. Если policy равна
None(по умолчанию), используйте политику, связанную с объектомMessageилиEmailMessage, переданным вflatten, для управления генерацией сообщения. Подробнее о том, что контролирует policy, см. вemail.policy.Введено в версии 3.2.
Изменено в версии 3.3: Добавлен ключевой параметр policy.
Изменено в версии 3.6: Поведение по умолчанию параметров mangle_from_ и maxheaderlen теперь соответствует политике policy.
-
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, выводится разделитель заголовка конверта, используемый в формате почтового ящика 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 сериализуется в поток ввода-вывода, который не является «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, за исключением того, что части, не являющиеся 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 нетекстовой части -
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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/email.generator.html