email.policy.md
1> **Источник:** https://python-all.ru/3.13/library/email.policy.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `email.policy`: Объекты Policy89Добавлено в версии 3.3.1011**Исходный код:** [Lib/email/policy.py](https://python-all.ru/src/3.13/Lib/email/policy.py)1213---1415Основное назначение пакета [`email`](https://python-all.ru/3.13/library/email.html#module-email) – обработка email-сообщений в соответствии с различными RFC, касающимися электронной почты и MIME. Однако общий формат email-сообщений (блок полей заголовка, каждое из которых состоит из имени, за которым следует двоеточие и значение; весь блок, за которым следует пустая строка и произвольное «тело») оказался полезным и за пределами электронной почты. Некоторые из этих вариантов использования довольно точно соответствуют основным RFC электронной почты, некоторые – нет. Даже при работе с электронной почтой иногда желательно отступить от строгого соответствия RFC, например, при создании писем для взаимодействия с почтовыми серверами, которые сами не следуют стандартам, или при реализации расширений, нарушающих стандарты.1617Объекты Policy обеспечивают пакету email гибкость для обработки всех этих разнородных сценариев использования.1819Объект [`Policy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy) инкапсулирует набор атрибутов и методов, управляющих поведением различных компонентов пакета email во время использования. Экземпляры `Policy` можно передавать различным классам и методам пакета email для изменения поведения по умолчанию. Устанавливаемые значения и их значения по умолчанию описаны ниже.2021Существует политика по умолчанию, используемая всеми классами в пакете email. Для всех классов [`parser`](https://python-all.ru/3.13/library/email.parser.html#module-email.parser) и связанных вспомогательных функций, а также для класса [`Message`](https://python-all.ru/3.13/library/email.compat32-message.html#email.message.Message) это политика [`Compat32`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Compat32) через соответствующий предопределённый экземпляр [`compat32`](https://python-all.ru/3.13/library/email.policy.html#email.policy.compat32). Эта политика обеспечивает полную обратную совместимость (в некоторых случаях, включая совместимость по ошибкам) с версией пакета email до Python 3.3.2223Это значение по умолчанию для ключевого слова *policy* в [`EmailMessage`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage) – политика [`EmailPolicy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.EmailPolicy) через её предопределённый экземпляр [`default`](https://python-all.ru/3.13/library/email.policy.html#email.policy.default).2425Когда создаётся объект [`Message`](https://python-all.ru/3.13/library/email.compat32-message.html#email.message.Message) или [`EmailMessage`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage), он получает политику. Если сообщение создаётся с помощью [`parser`](https://python-all.ru/3.13/library/email.parser.html#module-email.parser), политика, переданная парсеру, будет использоваться созданным сообщением. Если сообщение создаётся программно, политику можно указать при его создании. Когда сообщение передаётся в [`generator`](https://python-all.ru/3.13/library/email.generator.html#module-email.generator), генератор по умолчанию использует политику сообщения, но можно также передать конкретную политику генератору, которая переопределит политику, хранящуюся в объекте сообщения.2627Значение по умолчанию для ключевого слова *policy* для классов [`email.parser`](https://python-all.ru/3.13/library/email.parser.html#module-email.parser) и вспомогательных функций парсера **изменится** в одной из будущих версий Python. Поэтому следует **всегда явно указывать, какую политику вы хотите использовать** при вызове любых классов и функций, описанных в модуле `parser`.2829The first part of this documentation covers the features of [`Policy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy), an [abstract base class](https://python-all.ru/3.13/glossary.html#term-abstract-base-class) that defines the features that are common to all policy objects, including [`compat32`](https://python-all.ru/3.13/library/email.policy.html#email.policy.compat32). This includes certain hook methods that are called internally by the email package, which a custom policy could override to obtain different behavior. The second part describes the concrete classes [`EmailPolicy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.EmailPolicy) and [`Compat32`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Compat32), which implement the hooks that provide the standard behavior and the backward compatible behavior and features, respectively.3031Экземпляры [`Policy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy) неизменяемы, но их можно клонировать, принимая те же ключевые аргументы, что и конструктор класса, и возвращая новый экземпляр `Policy`, который является копией исходного, но с изменёнными значениями указанных атрибутов.3233В качестве примера, следующий код можно использовать для чтения email-сообщения из файла на диске и передачи его системной программе `sendmail` в Unix-системе:3435```pycon36>>> from email import message_from_binary_file37>>> from email.generator import BytesGenerator38>>> from email import policy39>>> from subprocess import Popen, PIPE40>>> with open('mymsg.txt', 'rb') as f:41... msg = message_from_binary_file(f, policy=policy.default)42...43>>> p = Popen(['sendmail', msg['To'].addresses[0]], stdin=PIPE)44>>> g = BytesGenerator(p.stdin, policy=msg.policy.clone(linesep='\r\n'))45>>> g.flatten(msg)46>>> p.stdin.close()47>>> rc = p.wait()48```4950Здесь мы указываем [`BytesGenerator`](https://python-all.ru/3.13/library/email.generator.html#email.generator.BytesGenerator) использовать правильные по RFC символы разделителей строк при создании двоичной строки для передачи в `sendmail's` `stdin`, тогда как политика по умолчанию использовала бы разделители строк `\n`.5152Некоторые методы пакета email принимают ключевой аргумент *policy*, позволяя переопределить политику для этого метода. Например, следующий код использует метод [`as_bytes()`](https://python-all.ru/3.13/library/email.compat32-message.html#email.message.Message.as_bytes) объекта *msg* из предыдущего примера и записывает сообщение в файл, используя собственные разделители строк для платформы, на которой он выполняется:5354```python55>>> import os56>>> with open('converted.txt', 'wb') as f:57... f.write(msg.as_bytes(policy=msg.policy.clone(linesep=os.linesep)))581759```6061Объекты Policy также можно комбинировать с помощью оператора сложения, получая объект политики, настройки которого представляют собой комбинацию нестандартных значений суммируемых объектов:6263```python64>>> compat_SMTP = policy.compat32.clone(linesep='\r\n')65>>> compat_strict = policy.compat32.clone(raise_on_defect=True)66>>> compat_strict_SMTP = compat_SMTP + compat_strict67```6869Эта операция не является коммутативной; то есть порядок добавления объектов имеет значение. Для иллюстрации:7071```python72>>> policy100 = policy.compat32.clone(max_line_length=100)73>>> policy80 = policy.compat32.clone(max_line_length=80)74>>> apolicy = policy100 + policy8075>>> apolicy.max_line_length768077>>> apolicy = policy80 + policy10078>>> apolicy.max_line_length7910080```8182#### `class email.policy.Policy(**kw)`8384Это [абстрактный базовый класс](https://python-all.ru/3.13/glossary.html#term-abstract-base-class) для всех классов политики. Он предоставляет реализации по умолчанию для пары тривиальных методов, а также реализацию свойства неизменяемости, метода [`clone()`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.clone) и семантики конструктора.8586Конструктору класса политики можно передавать различные ключевые аргументы. Аргументы, которые могут быть указаны, – это любые свойства, не являющиеся методами, этого класса, плюс любые дополнительные свойства, не являющиеся методами, конкретного класса. Значение, указанное в конструкторе, переопределит значение по умолчанию для соответствующего атрибута.8788Этот класс определяет следующие свойства, и, соответственно, значения для следующих могут быть переданы в конструктор любого класса политики:8990#### `max_line_length`9192Максимальная длина любой строки в сериализованном выводе, не считая символа(ов) конца строки. По умолчанию 78, согласно [**RFC 5322**](https://python-all.ru/3.13/library/email.policy.html). Значение `0` или [`None`](https://python-all.ru/3.13/library/constants.html#None) указывает, что перенос строк вообще не должен выполняться.9394#### `linesep`9596Строка, используемая для завершения строк в сериализованном выводе. По умолчанию `\n`, поскольку это внутренний стандарт окончания строк, используемый Python, хотя `\r\n` требуется RFC.9798#### `cte_type`99100Управляет типом кодирования передачи содержимого, которое может или должно использоваться. Возможные значения:101102| `7bit` | все данные должны быть «7-битно чистыми» (только ASCII). Это означает, что при необходимости данные будут закодированы с использованием quoted-printable или base64-кодировки. |103| --- | --- |104| `8bit` | данные не обязаны быть 7-битно чистыми. Данные в заголовках по-прежнему должны быть только ASCII и поэтому будут кодироваться (см. [`fold_binary()`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.fold_binary) и [`utf8`](https://python-all.ru/3.13/library/email.policy.html#email.policy.EmailPolicy.utf8) ниже для исключений), но части тела могут использовать CTE `8bit`. |105106Значение `cte_type` равное `8bit` работает только с `BytesGenerator`, а не с `Generator`, потому что строки не могут содержать двоичные данные. Если `Generator` работает в рамках политики, задающей `cte_type=8bit`, он будет действовать так, как будто `cte_type` имеет значение `7bit`.107108#### `raise_on_defect`109110Если [`True`](https://python-all.ru/3.13/library/constants.html#True), любые обнаруженные дефекты будут вызываться как ошибки. Если [`False`](https://python-all.ru/3.13/library/constants.html#False) (по умолчанию), дефекты будут передаваться методу [`register_defect()`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.register_defect).111112#### `mangle_from_`113114Если [`True`](https://python-all.ru/3.13/library/constants.html#True), строки в теле, начинающиеся с *“From “*, экранируются добавлением `>` перед ними. Этот параметр используется, когда сообщение сериализуется генератором. По умолчанию: [`False`](https://python-all.ru/3.13/library/constants.html#False).115116Добавлено в версии 3.5.117118#### `message_factory`119120Фабричная функция для создания нового пустого объекта сообщения. Используется парсером при построении сообщений. По умолчанию `None`, в этом случае используется [`Message`](https://python-all.ru/3.13/library/email.compat32-message.html#email.message.Message).121122Добавлено в версии 3.6.123124#### `verify_generated_headers`125126Если `True` (по умолчанию), генератор возбудит исключение [`HeaderWriteError`](https://python-all.ru/3.13/library/email.errors.html#email.errors.HeaderWriteError) вместо записи заголовка, который неправильно свёрнут или разграничен, так что он может быть разобран как несколько заголовков или объединён с соседними данными. Такие заголовки могут быть созданы пользовательскими классами заголовков или ошибками в модуле `email`.127128Поскольку это функция безопасности, по умолчанию используется `True` даже в политике [`Compat32`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Compat32). Для совместимости с предыдущими версиями, но небезопасного поведения, необходимо явно установить значение `False`.129130Добавлено в версии 3.13.131132Следующий метод `Policy` предназначен для вызова из кода, использующего библиотеку email, для создания экземпляров политики с пользовательскими настройками:133134#### `clone(**kw)`135136Возвращает новый экземпляр `Policy`, атрибуты которого имеют те же значения, что и у текущего экземпляра, за исключением тех атрибутов, которым присвоены новые значения через именованные аргументы.137138Остальные методы `Policy` вызываются кодом пакета email и не предназначены для вызова из приложения, использующего пакет email. Пользовательская политика должна реализовывать все эти методы.139140#### `handle_defect(obj, defect)`141142Обрабатывает *дефект*, обнаруженный в *obj*. Когда пакет email вызывает этот метод, *defect* всегда будет подклассом [`MessageDefect`](https://python-all.ru/3.13/library/email.errors.html#email.errors.MessageDefect).143144Реализация по умолчанию проверяет флаг [`raise_on_defect`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.raise_on_defect). Если он равен `True`, *defect* возбуждается как исключение. Если он равен `False` (по умолчанию), *obj* и *defect* передаются в [`register_defect()`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.register_defect).145146#### `register_defect(obj, defect)`147148Регистрирует *дефект* для *obj*. В пакете email *defect* всегда будет подклассом [`MessageDefect`](https://python-all.ru/3.13/library/email.errors.html#email.errors.MessageDefect).149150Реализация по умолчанию вызывает метод `append` атрибута `defects` объекта *obj*. Когда пакет email вызывает [`handle_defect`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.handle_defect), объект *obj* обычно имеет атрибут `defects`, который содержит метод `append`. Пользовательские типы объектов, используемые с пакетом email (например, пользовательские объекты `Message`), также должны предоставлять такой атрибут, иначе дефекты в разобранных сообщениях приведут к неожиданным ошибкам.151152#### `header_max_count(name)`153154Возвращает максимально допустимое количество заголовков с именем *name*.155156Вызывается при добавлении заголовка в объект [`EmailMessage`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage) или [`Message`](https://python-all.ru/3.13/library/email.compat32-message.html#email.message.Message). Если возвращаемое значение не равно `0` или `None`, и уже существует количество заголовков с именем *name*, большее или равное возвращённому значению, возбуждается исключение [`ValueError`](https://python-all.ru/3.13/library/exceptions.html#ValueError).157158Поскольку поведение по умолчанию `Message.__setitem__` заключается в добавлении значения в список заголовков, можно легко создать дубликаты заголовков, не замечая этого. Этот метод позволяет ограничить количество экземпляров определённых заголовков, которые могут быть добавлены в объект `Message` программно. (Ограничение не учитывается парсером, который честно воспроизведёт столько заголовков, сколько есть в разбираемом сообщении.)159160Реализация по умолчанию возвращает `None` для всех имён заголовков.161162#### `header_source_parse(sourcelines)`163164Пакет email вызывает этот метод со списком строк, каждая из которых заканчивается символами разделения строк, найденными в разбираемом источнике. Первая строка включает имя заголовка поля и разделитель. Все пробельные символы в источнике сохраняются. Метод должен возвращать кортеж `(name, value)`, который будет сохранён в `Message` для представления разобранного заголовка.165166Если реализация хочет сохранить совместимость с существующими политиками пакета email, *name* должно быть именем с сохранением регистра (все символы до разделителя ‘`:`’), а *value* – развёрнутым значением (все символы разделителей строк удалены, но пробелы сохранены), с удалёнными начальными пробельными символами.167168*sourcelines* может содержать двоичные данные, экранированные суррогатами.169170Реализация по умолчанию отсутствует171172#### `header_store_parse(name, value)`173174Пакет email вызывает этот метод с именем и значением, предоставленными прикладной программой, когда она программно изменяет объект `Message` (в отличие от `Message`, созданного парсером). Метод должен возвращать кортеж `(name, value)`, который будет сохранён в `Message` для представления заголовка.175176Если реализация хочет сохранить совместимость с существующими политиками пакета email, *name* и *value* должны быть строками или подклассами строк, которые не изменяют содержимое переданных аргументов.177178Реализация по умолчанию отсутствует179180#### `header_fetch_parse(name, value)`181182Пакет email вызывает этот метод с *именем* и *значением*, хранящимися в данный момент в `Message`, когда заголовок запрашивается прикладной программой, и то, что возвращает метод, передаётся обратно приложению в качестве значения запрашиваемого заголовка. Обратите внимание, что в `Message` может быть несколько заголовков с одним и тем же именем; методу передаются конкретные имя и значение заголовка, который будет возвращён приложению.183184*value* может содержать бинарные данные с суррогатным экранированием. В возвращаемом методом значении не должно быть таких бинарных данных.185186Реализация по умолчанию отсутствует187188#### `fold(name, value)`189190Пакет email вызывает этот метод с *именем* и *значением*, хранящимися в данный момент в `Message` для заданного заголовка. Метод должен вернуть строку, которая представляет этот заголовок, «сложенный» (folded) правильно (в соответствии с настройками политики) путём составления *имени* с *значением* и вставки символов [`linesep`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.linesep) в нужных местах. См. [**RFC 5322**](https://python-all.ru/3.13/library/email.policy.html) для обсуждения правил сворачивания заголовков электронной почты.191192*value* может содержать бинарные данные с суррогатным экранированием. В возвращаемой методом строке не должно быть таких бинарных данных.193194#### `fold_binary(name, value)`195196То же, что и [`fold()`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.fold), за исключением того, что возвращаемое значение должно быть объектом bytes, а не строкой.197198*value* может содержать бинарные данные с суррогатным экранированием. Они могут быть преобразованы обратно в бинарные данные в возвращаемом байтовом объекте.199200#### `class email.policy.EmailPolicy(**kw)`201202Этот конкретный [`Policy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy) обеспечивает поведение, которое должно полностью соответствовать текущим RFC электронной почты. Они включают (но не ограничиваются) [**RFC 5322**](https://python-all.ru/3.13/library/email.policy.html), [**RFC 2047**](https://python-all.ru/3.13/library/email.policy.html) и текущим RFC MIME.203204Эта политика добавляет новые алгоритмы разбора и сворачивания заголовков. Вместо простых строк заголовки являются `str` подклассами с атрибутами, которые зависят от типа поля. Алгоритмы разбора и сворачивания полностью реализуют [**RFC 2047**](https://python-all.ru/3.13/library/email.policy.html) и [**RFC 5322**](https://python-all.ru/3.13/library/email.policy.html).205206Значением по умолчанию для атрибута [`message_factory`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.message_factory) является [`EmailMessage`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage).207208В дополнение к настраиваемым атрибутам, перечисленным выше и относящимся ко всем политикам, эта политика добавляет следующие дополнительные атрибуты:209210Добавлено в версии 3.6: [\[1\]](https://python-all.ru/3.13/library/email.policy.html#id2)211212#### `utf8`213214If `False`, follow [**RFC 5322**](https://python-all.ru/3.13/library/email.policy.html), supporting non-ASCII characters in headers by encoding them as “encoded words”. If `True`, follow [**RFC 6532**](https://python-all.ru/3.13/library/email.policy.html) and use `utf-8` encoding for headers. Messages formatted in this way may be passed to SMTP servers that support the `SMTPUTF8` extension ([**RFC 6531**](https://python-all.ru/3.13/library/email.policy.html)).215216#### `refold_source`217218Если значение заголовка в объекте `Message` получено из [`parser`](https://python-all.ru/3.13/library/email.parser.html#module-email.parser) (а не установлено программой), этот атрибут указывает, должен ли генератор заново сворачивать это значение при преобразовании сообщения обратно в сериализованную форму. Возможные значения:219220| `none` | все исходные значения используют исходное сворачивание |221| --- | --- |222| `long` | исходные значения, имеющие строки длиннее `max_line_length`, будут свёрнуты заново |223| `all` | все значения сворачиваются заново. |224225Значение по умолчанию: `long`.226227#### `header_factory`228229A callable that takes two arguments, `name` and `value`, where `name` is a header field name and `value` is an unfolded header field value, and returns a string subclass that represents that header. A default `header_factory` (see [`headerregistry`](https://python-all.ru/3.13/library/email.headerregistry.html#module-email.headerregistry)) is provided that supports custom parsing for the various address and date [**RFC 5322**](https://python-all.ru/3.13/library/email.policy.html) header field types, and the major MIME header field stypes. Support for additional custom parsing will be added in the future.230231#### `content_manager`232233Объект как минимум с двумя методами: get\_content и set\_content. Когда вызывается метод [`get_content()`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage.get_content) или [`set_content()`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage.set_content) объекта [`EmailMessage`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage), он вызывает соответствующий метод этого объекта, передавая ему объект сообщения в качестве первого аргумента, а также любые аргументы или ключевые слова, переданные ему как дополнительные аргументы. По умолчанию `content_manager` устанавливается в [`raw_data_manager`](https://python-all.ru/3.13/library/email.contentmanager.html#email.contentmanager.raw_data_manager).234235Добавлено в версии 3.4.236237Класс предоставляет следующие конкретные реализации абстрактных методов [`Policy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy):238239#### `header_max_count(name)`240241Возвращает значение атрибута [`max_count`](https://python-all.ru/3.13/library/email.headerregistry.html#email.headerregistry.BaseHeader.max_count) специализированного класса, используемого для представления заголовка с данным именем.242243#### `header_source_parse(sourcelines)`244245Имя разбирается как всё до символа '`:`' и возвращается без изменений. Значение определяется путём удаления ведущих пробелов из остатка первой строки, объединения всех последующих строк вместе и удаления любых завершающих символов возврата каретки или перевода строки.246247#### `header_store_parse(name, value)`248249Имя возвращается без изменений. Если входное значение имеет атрибут `name` и он совпадает с *именем* без учёта регистра, значение возвращается без изменений. В противном случае *имя* и *значение* передаются в `header_factory`, и возвращается полученный объект заголовка в качестве значения. В этом случае возбуждается `ValueError`, если входное значение содержит символы CR или LF.250251#### `header_fetch_parse(name, value)`252253Если значение имеет атрибут `name`, оно возвращается без изменений. В противном случае *имя* и *значение* с удалёнными символами CR или LF передаются в `header_factory`, и возвращается полученный объект заголовка. Любые байты с суррогатным экранированием превращаются в глиф неизвестного символа Unicode.254255#### `fold(name, value)`256257Свёртка заголовков управляется настройкой политики [`refold_source`](https://python-all.ru/3.13/library/email.policy.html#email.policy.EmailPolicy.refold_source). Значение считается «исходным значением» тогда и только тогда, когда у него нет атрибута `name` (наличие атрибута `name` означает, что это объект заголовка того или иного вида). Если исходное значение необходимо пересвернуть в соответствии с политикой, оно преобразуется в объект заголовка путём передачи *имени* и *значения* (с удалёнными символами CR и LF) в `header_factory`. Свёртка объекта заголовка выполняется вызовом его метода `fold` с текущей политикой.258259Исходные значения разбиваются на строки с помощью [`splitlines()`](https://python-all.ru/3.13/library/stdtypes.html#str.splitlines). Если значение не требуется пересвёртывать, строки объединяются обратно с использованием `linesep` из политики и возвращаются. Исключение составляют строки, содержащие не-ASCII двоичные данные. В этом случае значение пересвёртывается независимо от настройки `refold_source`, что приводит к кодированию двоичных данных с помощью CTE с использованием кодировки `unknown-8bit`.260261#### `fold_binary(name, value)`262263То же, что и [`fold()`](https://python-all.ru/3.13/library/email.policy.html#email.policy.EmailPolicy.fold), если [`cte_type`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.cte_type) равно `7bit`, за исключением того, что возвращаемое значение – байты.264265Если [`cte_type`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy.cte_type) равно `8bit`, не-ASCII двоичные данные преобразуются обратно в байты. Заголовки с двоичными данными не пересвёртываются независимо от настройки `refold_header`, так как невозможно определить, состоят ли двоичные данные из однобайтовых или многобайтовых символов.266267Следующие экземпляры [`EmailPolicy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.EmailPolicy) предоставляют значения по умолчанию, подходящие для конкретных прикладных областей. Обратите внимание, что в будущем поведение этих экземпляров (в частности экземпляра `HTTP`) может быть скорректировано для ещё более точного соответствия RFC, относящимся к их областям.268269#### `email.policy.default`270271Экземпляр `EmailPolicy` со всеми значениями по умолчанию без изменений. Эта политика использует стандартные для Python окончания строк `\n` вместо правильных по RFC `\r\n`.272273#### `email.policy.SMTP`274275Подходит для сериализации сообщений в соответствии с RFC электронной почты. Как `default`, но с `linesep`, установленным в `\r\n`, что соответствует RFC.276277#### `email.policy.SMTPUTF8`278279То же, что и `SMTP`, за исключением того, что [`utf8`](https://python-all.ru/3.13/library/email.policy.html#email.policy.EmailPolicy.utf8) равно `True`. Полезно для сериализации сообщений в хранилище без использования закодированных слов в заголовках. Следует использовать только для передачи по SMTP, если адреса отправителя или получателя содержат символы, не входящие в ASCII (метод [`smtplib.SMTP.send_message()`](https://python-all.ru/3.13/library/smtplib.html#smtplib.SMTP.send_message) обрабатывает это автоматически).280281#### `email.policy.HTTP`282283Подходит для сериализации заголовков для использования в HTTP-трафике. Как `SMTP`, за исключением того, что `max_line_length` установлено в `None` (неограниченно).284285#### `email.policy.strict`286287Удобный экземпляр. То же, что и `default`, за исключением того, что `raise_on_defect` установлено в `True`. Это позволяет сделать любую политику строгой, написав:288289```python290somepolicy + policy.strict291```292293Со всеми этими [`EmailPolicies`](https://python-all.ru/3.13/library/email.policy.html#email.policy.EmailPolicy) действующий API пакета email изменяется по сравнению с API Python 3.2 следующим образом:294295- Установка заголовка в [`Message`](https://python-all.ru/3.13/library/email.compat32-message.html#email.message.Message) приводит к разбору этого заголовка и созданию объекта заголовка.296- Получение значения заголовка из [`Message`](https://python-all.ru/3.13/library/email.compat32-message.html#email.message.Message) приводит к разбору этого заголовка и созданию объекта заголовка, который затем возвращается.297- Любой объект заголовка или любой заголовок, который пересвёртывается в соответствии с настройками политики, свёртывается с использованием алгоритма, полностью реализующего алгоритмы свёртки RFC, включая знание того, где требуются и разрешены закодированные слова.298299С точки зрения приложения это означает, что любой заголовок, полученный через [`EmailMessage`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage), является объектом заголовка с дополнительными атрибутами, строковое значение которого – полностью декодированное значение заголовка в Unicode. Аналогично, заголовку может быть присвоено новое значение или создан новый заголовок с использованием строки Unicode, и политика позаботится о преобразовании строки Unicode в правильную закодированную форму RFC.300301Объекты заголовков и их атрибуты описаны в [`headerregistry`](https://python-all.ru/3.13/library/email.headerregistry.html#module-email.headerregistry).302303#### `class email.policy.Compat32(**kw)`304305Этот конкретный [`Policy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy) является политикой обратной совместимости. Он воспроизводит поведение пакета email в Python 3.2. Модуль `policy` также определяет экземпляр этого класса, [`compat32`](https://python-all.ru/3.13/library/email.policy.html#email.policy.compat32), который используется в качестве политики по умолчанию. Таким образом, поведение пакета email по умолчанию – сохранять совместимость с Python 3.2.306307Следующие атрибуты имеют значения, отличные от значения по умолчанию [`Policy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy):308309#### `mangle_from_`310311Значение по умолчанию: `True`.312313Класс предоставляет следующие конкретные реализации абстрактных методов [`Policy`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Policy):314315#### `header_source_parse(sourcelines)`316317Имя разбирается как всё до символа '`:`' и возвращается без изменений. Значение определяется путём удаления ведущих пробелов из остатка первой строки, объединения всех последующих строк вместе и удаления любых завершающих символов возврата каретки или перевода строки.318319#### `header_store_parse(name, value)`320321Имя и значение возвращаются без изменений.322323#### `header_fetch_parse(name, value)`324325Если значение содержит двоичные данные, оно преобразуется в объект [`Header`](https://python-all.ru/3.13/library/email.header.html#email.header.Header) с использованием кодировки `unknown-8bit`. В противном случае оно возвращается без изменений.326327#### `fold(name, value)`328329Заголовки сворачиваются с помощью алгоритма свёртки [`Header`](https://python-all.ru/3.13/library/email.header.html#email.header.Header), который сохраняет существующие переносы строк в значении и оборачивает каждую результирующую строку до `max_line_length`. Не-ASCII двоичные данные кодируются с помощью CTE с использованием кодировки `unknown-8bit`.330331#### `fold_binary(name, value)`332333Заголовки сворачиваются с помощью алгоритма свёртки [`Header`](https://python-all.ru/3.13/library/email.header.html#email.header.Header), который сохраняет существующие переносы строк в значении и оборачивает каждую результирующую строку до `max_line_length`. Если `cte_type` равно `7bit`, не-ASCII двоичные данные кодируются с помощью CTE с использованием кодировки `unknown-8bit`. В противном случае используется исходный заголовок с его существующими переносами строк и любыми (не соответствующими RFC) двоичными данными, которые он может содержать.334335#### `email.policy.compat32`336337Экземпляр [`Compat32`](https://python-all.ru/3.13/library/email.policy.html#email.policy.Compat32), обеспечивающий обратную совместимость с поведением пакета email в Python 3.2.338339> **Примечание**340>341> Политику [`compat32`](https://python-all.ru/3.13/library/email.policy.html#email.policy.compat32) не следует использовать в качестве политики для объектов [`EmailMessage`](https://python-all.ru/3.13/library/email.message.html#email.message.EmailMessage), и её следует использовать только для сериализации сообщений, созданных с помощью политики `compat32`.342343Сноски344345\[[1](https://python-all.ru/3.13/library/email.policy.html#id1)\]346347Изначально добавлено в версии 3.3 как [экспериментальная функция](https://python-all.ru/3.13/glossary.html#term-provisional-package).348