email.generator.md
1> **Источник:** https://python-all.ru/3.0/library/email.generator.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`email`](https://python-all.ru/3.0/library/email.html#module-email): создание MIME-документов89Одна из самых распространённых задач – сгенерировать плоский текст email-сообщения, представленного структурой объекта сообщения. Это понадобится, чтобы отправить сообщение через модуль [`smtplib`](https://python-all.ru/3.0/library/smtplib.html#module-smtplib) или модуль [`nntplib`](https://python-all.ru/3.0/library/nntplib.html#module-nntplib), либо вывести сообщение на консоль. Получение структуры объекта сообщения и создание плоского текстового документа – задача класса [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator).1011Как и с модулем [`email.parser`](https://python-all.ru/3.0/library/email.parser.html#module-email.parser), возможности не ограничиваются функциональностью встроенного генератора; можно написать свой собственный с нуля. Однако встроенный генератор умеет создавать большинство писем в соответствии со стандартами, корректно обрабатывает как MIME, так и не MIME сообщения, и спроектирован так, что преобразование из плоского текста в структуру сообщения через класс `Parser` и обратно в плоский текст является идемпотентным (вход идентичен выходу).1213Ниже приведены публичные методы класса [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator), импортированные из модуля `email.generator`:1415#### `[email.generator.Generator]class email.generator.Generator(outfp[, mangle_from_[, maxheaderlen]])`1617Конструктор класса [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator) принимает файлоподобный объект, называемый *outfp*, в качестве аргумента. *outfp* должен поддерживать метод [`write()`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator.write) и быть пригодным для использования в качестве выходного файла для функции [`print()`](https://python-all.ru/3.0/library/functions.html#print).1819Необязательный параметр *mangle\_from\_* – это флаг, который при значении `True` добавляет символ `>` перед любой строкой в теле, которая начинается точно как `From`, то есть `From`, за которым следует пробел в начале строки. Это единственный гарантированно переносимый способ избежать того, чтобы такие строки были приняты за разделитель заголовка конверта в формате почтового ящика Unix (см. [WHY THE CONTENT-LENGTH FORMAT IS BAD](https://python-all.ru/3.0/library/email.generator.html) для подробностей). *mangle\_from\_* по умолчанию равен `True`, но возможно, потребуется установить его в `False`, если вы не пишете файлы в формате почтового ящика Unix.2021Необязательный параметр *maxheaderlen* задает максимальную длину для непродолженного заголовка. Если строка заголовка длиннее *maxheaderlen* (в символах, табуляция заменяется на 8 пробелов), заголовок будет разбит в соответствии с классом `email.header.Header`. Установите значение 0, чтобы отключить перенос заголовков. По умолчанию используется 78, как рекомендовано (но не обязательно) в [**RFC 2822**](https://python-all.ru/3.0/library/email.generator.html).2223Другие публичные методы [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator):2425#### `[email.generator.Generator.flatten]flatten(msg[, unixfrom])`2627Выводит текстовое представление структуры объекта сообщения, начиная с *msg*, в выходной файл, заданный при создании экземпляра [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator). Вложенные части обходятся в глубину, и результирующий текст будет корректно закодирован в MIME.2829Необязательный параметр *unixfrom* – это флаг, который принудительно выводит разделитель заголовка конверта перед первым заголовком [**RFC 2822**](https://python-all.ru/3.0/library/email.generator.html) корневого объекта сообщения. Если у корневого объекта нет заголовка конверта, создается стандартный. По умолчанию установлено `False`, чтобы не выводить разделитель конверта.3031Обратите внимание, что для вложенных частей заголовок конверта никогда не печатается.3233#### `[email.generator.Generator.clone]clone(fp)`3435Возвращает независимую копию этого экземпляра3637[`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator)3839с точно такими же параметрами.4041#### `[email.generator.Generator.write]write(s)`4243Записывает строку4445*s*4647в базовый файловый объект, т.е.4849*outfp*5051, переданный конструктору5253[`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator)5455. Этого достаточно, чтобы экземпляры5657[`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator)5859могли использоваться в функции6061[`print()`](https://python-all.ru/3.0/library/functions.html#print)6263.6465Для удобства обратитесь к методам `Message.as_string()` и `str(aMessage)`, он же `Message.__str__()`, которые упрощают создание строкового представления объекта сообщения. За более подробной информацией обращайтесь к [`email.message`](https://python-all.ru/3.0/library/email.message.html#module-email.message).6667Модуль `email.generator` также предоставляет производный класс, называемый [`DecodedGenerator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.DecodedGenerator), который похож на базовый класс [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator), за исключением того, что не-*text* части заменяются форматной строкой, представляющей эту часть.6869#### `[email.generator.DecodedGenerator]class email.generator.DecodedGenerator(outfp[, mangle_from_[, maxheaderlen[, fmt]]])`7071Этот класс, производный от [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator), обходит все подчасти сообщения. Если подчасть имеет основной тип *text*, то выводится декодированное содержимое подчасти. Необязательные параметры *\_mangle\_from\_* и *maxheaderlen* работают так же, как в базовом классе [`Generator`](https://python-all.ru/3.0/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