email.generator: Генерация документов MIME
Исходный код: Lib/email/generator.py
Одной из самых распространённых задач является генерация плоской (сериализованной) версии сообщения электронной почты, представленного структурой объекта сообщения. Вам потребуется сделать это, если вы хотите отправить своё сообщение через smtplib.SMTP.sendmail() или модуль nntplib, или напечатать сообщение в консоли. Преобразование структуры объекта сообщения в сериализованное представление – задача классов-генераторов.
Как и в модуле email.parser, вы не ограничены функциональностью встроенного генератора; вы можете написать свой собственный. Однако встроенный генератор умеет генерировать большинство сообщений электронной почты в соответствии со стандартами, корректно обрабатывает сообщения MIME и не-MIME, и разработан так, что операции по байтовому парсингу и генерации являются обратными, при условии использования той же не преобразующей policy для обоих. То есть, парсинг сериализованного байтового потока с помощью класса BytesParser и последующая регенерация сериализованного байтового потока с помощью BytesGenerator должны давать идентичный результат, как и входной 1. (С другой стороны, использование генератора с объектом EmailMessage, созданным программой, может привести к изменениям в объекте EmailMessage, поскольку значения по умолчанию заполняются.)
Класс Generator может быть использован для преобразования сообщения в текстовое (в отличие от двоичного) сериализованное представление, но поскольку Unicode не может напрямую представлять двоичные данные, сообщение по необходимости преобразуется в нечто, содержащее только символы ASCII, используя стандартные методы кодирования MIME Content Transfer Encoding для кодирования сообщений электронной почты для передачи по каналам, которые не являются «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, не переформатировать заголовки. Если manheaderlen равноNone(значение по умолчанию), переформатировать заголовки и другие строки сообщения в соответствии с настройками политики policy.Если policy задан, использовать эту политику для управления генерацией сообщения. Если policy равен
None(значение по умолчанию), использовать политику, связанную с объектомMessageилиEmailMessage, переданным вflatten, для управления генерацией сообщения. См.email.policyдля получения подробной информации о том, что контролирует параметр 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 и закодировать не-ASCII байты в заголовках, не соответствующие RFC, с помощью набора символов 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и ПОЧЕМУ ФОРМАТ CONTENT-LENGTH ПЛОХИЙ).Если 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. То есть преобразуйте части с Content-Transfer-Encoding, не являющимся ASCII (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.Изменено в версии 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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/email.generator.html