> **Источник:** https://python-all.ru/3.0/library/email.generator.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# [`email`](https://python-all.ru/3.0/library/email.html#module-email): создание MIME-документов

Одна из самых распространённых задач – сгенерировать плоский текст 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).

Как и с модулем [`email.parser`](https://python-all.ru/3.0/library/email.parser.html#module-email.parser), возможности не ограничиваются функциональностью встроенного генератора; можно написать свой собственный с нуля. Однако встроенный генератор умеет создавать большинство писем в соответствии со стандартами, корректно обрабатывает как MIME, так и не MIME сообщения, и спроектирован так, что преобразование из плоского текста в структуру сообщения через класс `Parser` и обратно в плоский текст является идемпотентным (вход идентичен выходу).

Ниже приведены публичные методы класса [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator), импортированные из модуля `email.generator`:

#### `[email.generator.Generator]class email.generator.Generator(outfp[, mangle_from_[, maxheaderlen]])`

Конструктор класса [`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).

Необязательный параметр *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.

Необязательный параметр *maxheaderlen* задает максимальную длину для непродолженного заголовка. Если строка заголовка длиннее *maxheaderlen* (в символах, табуляция заменяется на 8 пробелов), заголовок будет разбит в соответствии с классом `email.header.Header`. Установите значение 0, чтобы отключить перенос заголовков. По умолчанию используется 78, как рекомендовано (но не обязательно) в [**RFC 2822**](https://python-all.ru/3.0/library/email.generator.html).

Другие публичные методы [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator):

#### `[email.generator.Generator.flatten]flatten(msg[, unixfrom])`

Выводит текстовое представление структуры объекта сообщения, начиная с *msg*, в выходной файл, заданный при создании экземпляра [`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator). Вложенные части обходятся в глубину, и результирующий текст будет корректно закодирован в MIME.

Необязательный параметр *unixfrom* – это флаг, который принудительно выводит разделитель заголовка конверта перед первым заголовком [**RFC 2822**](https://python-all.ru/3.0/library/email.generator.html) корневого объекта сообщения. Если у корневого объекта нет заголовка конверта, создается стандартный. По умолчанию установлено `False`, чтобы не выводить разделитель конверта.

Обратите внимание, что для вложенных частей заголовок конверта никогда не печатается.

#### `[email.generator.Generator.clone]clone(fp)`

Возвращает независимую копию этого экземпляра

[`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator)

с точно такими же параметрами.

#### `[email.generator.Generator.write]write(s)`

Записывает строку

*s*

в базовый файловый объект, т.е.

*outfp*

, переданный конструктору

[`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator)

. Этого достаточно, чтобы экземпляры

[`Generator`](https://python-all.ru/3.0/library/email.generator.html#email.generator.Generator)

могли использоваться в функции

[`print()`](https://python-all.ru/3.0/library/functions.html#print)

.

Для удобства обратитесь к методам `Message.as_string()` и `str(aMessage)`, он же `Message.__str__()`, которые упрощают создание строкового представления объекта сообщения. За более подробной информацией обращайтесь к [`email.message`](https://python-all.ru/3.0/library/email.message.html#module-email.message).

Модуль `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* части заменяются форматной строкой, представляющей эту часть.

#### `[email.generator.DecodedGenerator]class email.generator.DecodedGenerator(outfp[, mangle_from_[, maxheaderlen[, fmt]]])`

Этот класс, производный от [`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).

Если подчасть не является основным типом *text*, необязательный параметр *fmt* – это форматная строка, используемая вместо содержимого сообщения. *fmt* разворачивается с использованием следующих ключевых слов в формате `%(keyword)s`:

- `type` – Full MIME type of the non-*text* part
- `maintype` – Main MIME type of the non-*text* part
- `subtype` – Sub-MIME type of the non-*text* part
- `filename` – Filename of the non-*text* part
- `description` – Description associated with the non-*text* part
- `encoding` – Content transfer encoding of the non-*text* part

Значение по умолчанию для *fmt* – `None`, что означает

```python
[Non-text (%(type)s) part of message omitted, filename %(filename)s]
```
