email.generator.md
1> **Источник:** https://python-all.ru/3.1/library/email.generator.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.1.3. [`email`](https://python-all.ru/3.1/library/email.html#module-email): создание MIME-документов89Одна из самых распространённых задач – сгенерировать плоский текст email-сообщения, представленного структурой объекта сообщения. Это понадобится, чтобы отправить сообщение через модуль [`smtplib`](https://python-all.ru/3.1/library/smtplib.html#module-smtplib) или модуль [`nntplib`](https://python-all.ru/3.1/library/nntplib.html#module-nntplib), либо вывести сообщение на консоль. Получение структуры объекта сообщения и создание плоского текстового документа – задача класса [`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator).1011Again, as with the [`email.parser`](https://python-all.ru/3.1/library/email.parser.html#module-email.parser) module, you aren’t limited to the functionality of the bundled generator; you could write one from scratch yourself. However the bundled generator knows how to generate most email in a standards-compliant way, should handle MIME and non-MIME email messages just fine, and is designed so that the transformation from flat text, to a message structure via the [`Parser`](https://python-all.ru/3.1/library/email.parser.html#email.parser.Parser) class, and back to flat text, is idempotent (the input is identical to the output). On the other hand, using the Generator on a [`Message`](https://python-all.ru/3.1/library/email.message.html#email.message.Message) constructed by program may result in changes to the [`Message`](https://python-all.ru/3.1/library/email.message.html#email.message.Message) object as defaults are filled in.1213Ниже приведены публичные методы класса [`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator), импортированные из модуля `email.generator`:1415#### `class email.generator.Generator(outfp, mangle_from_=True, maxheaderlen=78)`1617Конструктор класса [`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator) принимает аргумент – [*файлоподобный объект*](https://python-all.ru/3.1/glossary.html#term-file-like-object) с именем *outfp*. *outfp* должен поддерживать метод [`write()`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator.write) и быть пригодным для использования в качестве выходного файла для функции [`print()`](https://python-all.ru/3.1/library/functions.html#print).1819Необязательный параметр *mangle\_from\_* – это флаг, который при значении `True` добавляет символ `>` перед любой строкой в теле, которая начинается точно как `From`, то есть `From`, за которым следует пробел в начале строки. Это единственный гарантированно переносимый способ избежать того, чтобы такие строки были приняты за разделитель заголовка конверта в формате почтового ящика Unix (см. [WHY THE CONTENT-LENGTH FORMAT IS BAD](https://python-all.ru/3.1/library/email.generator.html) для подробностей). *mangle\_from\_* по умолчанию равен `True`, но возможно, потребуется установить его в `False`, если вы не пишете файлы в формате почтового ящика Unix.2021Необязательный параметр *maxheaderlen* задает максимальную длину для непродолженного заголовка. Если строка заголовка длиннее *maxheaderlen* (в символах, с табуляцией, развернутой в 8 пробелов), заголовок будет разбит, как определено в классе [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header). Установите значение 0, чтобы отключить перенос заголовков. По умолчанию 78, как рекомендовано (но не требуется) [**RFC 2822**](https://python-all.ru/3.1/library/email.generator.html).2223Другие публичные методы [`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator):2425#### `flatten(msg, unixfrom=False)`2627Выводит текстовое представление структуры объекта сообщения, начиная с *msg*, в выходной файл, заданный при создании экземпляра [`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator). Вложенные части обходятся в глубину, и результирующий текст будет корректно закодирован в MIME.2829Необязательный параметр *unixfrom* – это флаг, который принудительно выводит разделитель заголовка конверта перед первым заголовком [**RFC 2822**](https://python-all.ru/3.1/library/email.generator.html) корневого объекта сообщения. Если у корневого объекта нет заголовка конверта, создается стандартный. По умолчанию установлено `False`, чтобы не выводить разделитель конверта.3031Обратите внимание, что для вложенных частей заголовок конверта никогда не печатается.3233#### `clone(fp)`3435Возвращает независимую копию этого экземпляра3637[`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator)3839с точно такими же параметрами.4041#### `write(s)`4243Записывает строку4445*s*4647в базовый файловый объект, т.е.4849*outfp*5051, переданный конструктору5253[`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator)5455. Этого достаточно, чтобы экземпляры5657[`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator)5859могли использоваться в функции6061[`print()`](https://python-all.ru/3.1/library/functions.html#print)6263.6465Для удобства обратитесь к методам `Message.as_string()` и `str(aMessage)`, он же `Message.__str__()`, которые упрощают создание строкового представления объекта сообщения. За более подробной информацией обращайтесь к [`email.message`](https://python-all.ru/3.1/library/email.message.html#module-email.message).6667The `email.generator` module also provides a derived class, called `DecodedGenerator` which is like the [`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator) base class, except that non-*text* parts are substituted with a format string representing the part.6869#### `DecodedGenerator(outfp[, mangle_from_=True, maxheaderlen=78, fmt=None)`7071Этот класс, производный от [`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator), обходит все подчасти сообщения. Если подчасть имеет основной тип *text*, то выводится декодированное содержимое подчасти. Необязательные параметры *\_mangle\_from\_* и *maxheaderlen* работают так же, как в базовом классе [`Generator`](https://python-all.ru/3.1/library/email.generator.html#email.generator.Generator).7273Если подчасть не является основным типом *text*, необязательный параметр *fmt* – это форматная строка, используемая вместо содержимого сообщения. *fmt* разворачивается с использованием следующих ключевых слов в формате `%(keyword)s`:7475- `type` – Full MIME type of the non-*text* part76- `maintype` – Main MIME type of the non-*text* part77- `subtype` – Sub-MIME type of the non-*text* part78- `filename` – Filename of the non-*text* part79- `description` – Description associated with the non-*text* part80- `encoding` – Content transfer encoding of the non-*text* part8182Значение по умолчанию для *fmt* – `None`, что означает8384```python85[Non-text (%(type)s) part of message omitted, filename %(filename)s]86```87