email.policy.md
1> **Источник:** https://python-all.ru/3.9/library/email.policy.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`email.policy`](https://python-all.ru/3.9/library/email.policy.html#module-email.policy): Объекты Policy89Новое в версии 3.3.1011**Исходный код:** [Lib/email/policy.py](https://python-all.ru/src/3.9/Lib/email/policy.py)1213---1415Основное назначение пакета [`email`](https://python-all.ru/3.9/library/email.html#module-email) – обработка email-сообщений в соответствии с различными RFC, касающимися электронной почты и MIME. Однако общий формат email-сообщений (блок полей заголовка, каждое из которых состоит из имени, за которым следует двоеточие и значение; весь блок, за которым следует пустая строка и произвольное «тело») оказался полезным и за пределами электронной почты. Некоторые из этих вариантов использования довольно точно соответствуют основным RFC электронной почты, некоторые – нет. Даже при работе с электронной почтой иногда желательно отступить от строгого соответствия RFC, например, при создании писем для взаимодействия с почтовыми серверами, которые сами не следуют стандартам, или при реализации расширений, нарушающих стандарты.1617Объекты Policy обеспечивают пакету email гибкость для обработки всех этих разнородных сценариев использования.1819Объект [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy) инкапсулирует набор атрибутов и методов, управляющих поведением различных компонентов пакета email во время использования. Экземпляры [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy) можно передавать различным классам и методам пакета email для изменения поведения по умолчанию. Устанавливаемые значения и их значения по умолчанию описаны ниже.2021Существует политика по умолчанию, используемая всеми классами в пакете email. Для всех классов [`parser`](https://python-all.ru/3.9/library/email.parser.html#module-email.parser) и связанных вспомогательных функций, а также для класса [`Message`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message) это политика [`Compat32`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Compat32) через соответствующий предопределённый экземпляр [`compat32`](https://python-all.ru/3.9/library/email.policy.html#email.policy.compat32). Эта политика обеспечивает полную обратную совместимость (в некоторых случаях, включая совместимость по ошибкам) с версией пакета email до Python 3.3.2223Это значение по умолчанию для ключевого слова *policy* в [`EmailMessage`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage) – политика [`EmailPolicy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.EmailPolicy) через её предопределённый экземпляр [`default`](https://python-all.ru/3.9/library/email.policy.html#email.policy.default).2425Когда создаётся объект [`Message`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message) или [`EmailMessage`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage), он получает политику. Если сообщение создаётся с помощью [`parser`](https://python-all.ru/3.9/library/email.parser.html#module-email.parser), политика, переданная парсеру, будет использоваться созданным сообщением. Если сообщение создаётся программно, политику можно указать при его создании. Когда сообщение передаётся в [`generator`](https://python-all.ru/3.9/library/email.generator.html#module-email.generator), генератор по умолчанию использует политику сообщения, но можно также передать конкретную политику генератору, которая переопределит политику, хранящуюся в объекте сообщения.2627Значение по умолчанию для ключевого слова *policy* для классов [`email.parser`](https://python-all.ru/3.9/library/email.parser.html#module-email.parser) и вспомогательных функций парсера **изменится** в одной из будущих версий Python. Поэтому следует **всегда явно указывать, какую политику вы хотите использовать** при вызове любых классов и функций, описанных в модуле [`parser`](https://python-all.ru/3.9/library/email.parser.html#module-email.parser).2829The first part of this documentation covers the features of [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy), an [abstract base class](https://python-all.ru/3.9/glossary.html#term-abstract-base-class) that defines the features that are common to all policy objects, including [`compat32`](https://python-all.ru/3.9/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.9/library/email.policy.html#email.policy.EmailPolicy) and [`Compat32`](https://python-all.ru/3.9/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.9/library/email.policy.html#email.policy.Policy) неизменяемы, но их можно клонировать, принимая те же ключевые аргументы, что и конструктор класса, и возвращая новый экземпляр [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.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>>> p = Popen(['sendmail', msg['To'].addresses[0]], stdin=PIPE)43>>> g = BytesGenerator(p.stdin, policy=msg.policy.clone(linesep='\r\n'))44>>> g.flatten(msg)45>>> p.stdin.close()46>>> rc = p.wait()47```4849Здесь мы указываем [`BytesGenerator`](https://python-all.ru/3.9/library/email.generator.html#email.generator.BytesGenerator) использовать правильные по RFC символы разделителей строк при создании двоичной строки для передачи в `sendmail's` `stdin`, тогда как политика по умолчанию использовала бы разделители строк `\n`.5051Некоторые методы пакета email принимают ключевой аргумент *policy*, позволяя переопределить политику для этого метода. Например, следующий код использует метод [`as_bytes()`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message.as_bytes) объекта *msg* из предыдущего примера и записывает сообщение в файл, используя собственные разделители строк для платформы, на которой он выполняется:5253```python54>>> import os55>>> with open('converted.txt', 'wb') as f:56... f.write(msg.as_bytes(policy=msg.policy.clone(linesep=os.linesep)))571758```5960Объекты Policy также можно комбинировать с помощью оператора сложения, получая объект политики, настройки которого представляют собой комбинацию нестандартных значений суммируемых объектов:6162```python63>>> compat_SMTP = policy.compat32.clone(linesep='\r\n')64>>> compat_strict = policy.compat32.clone(raise_on_defect=True)65>>> compat_strict_SMTP = compat_SMTP + compat_strict66```6768Эта операция не является коммутативной; то есть порядок добавления объектов имеет значение. Для иллюстрации:6970```python71>>> policy100 = policy.compat32.clone(max_line_length=100)72>>> policy80 = policy.compat32.clone(max_line_length=80)73>>> apolicy = policy100 + policy8074>>> apolicy.max_line_length758076>>> apolicy = policy80 + policy10077>>> apolicy.max_line_length7810079```8081#### `class email.policy.Policy(**kw)`8283Это [абстрактный базовый класс](https://python-all.ru/3.9/glossary.html#term-abstract-base-class) для всех классов политики. Он предоставляет реализации по умолчанию для пары тривиальных методов, а также реализацию свойства неизменяемости, метода [`clone()`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.clone) и семантики конструктора.8485Конструктору класса политики можно передавать различные ключевые аргументы. Аргументы, которые могут быть указаны, – это любые свойства, не являющиеся методами, этого класса, плюс любые дополнительные свойства, не являющиеся методами, конкретного класса. Значение, указанное в конструкторе, переопределит значение по умолчанию для соответствующего атрибута.8687Этот класс определяет следующие свойства, и, соответственно, значения для следующих могут быть переданы в конструктор любого класса политики:8889#### `max_line_length`9091Максимальная длина любой строки в сериализованном выводе, не считая символа(ов) конца строки. По умолчанию 78, согласно [**RFC 5322**](https://python-all.ru/3.9/library/email.policy.html). Значение `0` или [`None`](https://python-all.ru/3.9/library/constants.html#None) указывает, что перенос строк вообще не должен выполняться.9293#### `linesep`9495Строка, используемая для завершения строк в сериализованном выводе. По умолчанию `\n`, поскольку это внутренний стандарт окончания строк, используемый Python, хотя `\r\n` требуется RFC.9697#### `cte_type`9899Управляет типом кодирования передачи содержимого, которое может или должно использоваться. Возможные значения:100101| `7bit` | все данные должны быть «7-битно чистыми» (только ASCII). Это означает, что при необходимости данные будут закодированы с использованием quoted-printable или base64-кодировки. |102| --- | --- |103| `8bit` | данные не обязаны быть 7-битно чистыми. Данные в заголовках по-прежнему должны быть только ASCII и поэтому будут кодироваться (см. [`fold_binary()`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.fold_binary) и [`utf8`](https://python-all.ru/3.9/library/email.policy.html#email.policy.EmailPolicy.utf8) ниже для исключений), но части тела могут использовать CTE `8bit`. |104105Значение `cte_type` равное `8bit` работает только с `BytesGenerator`, а не с `Generator`, потому что строки не могут содержать двоичные данные. Если `Generator` работает в рамках политики, задающей `cte_type=8bit`, он будет действовать так, как будто `cte_type` имеет значение `7bit`.106107#### `raise_on_defect`108109Если [`True`](https://python-all.ru/3.9/library/constants.html#True), любые обнаруженные дефекты будут вызываться как ошибки. Если [`False`](https://python-all.ru/3.9/library/constants.html#False) (по умолчанию), дефекты будут передаваться методу [`register_defect()`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.register_defect).110111#### `mangle_from_`112113Если [`True`](https://python-all.ru/3.9/library/constants.html#True), строки в теле, начинающиеся с *“From “*, экранируются добавлением `>` перед ними. Этот параметр используется, когда сообщение сериализуется генератором. По умолчанию: [`False`](https://python-all.ru/3.9/library/constants.html#False).114115Новое в версии 3.5: Параметр *mangle\_from\_*.116117#### `message_factory`118119Фабричная функция для создания нового пустого объекта сообщения. Используется парсером при построении сообщений. По умолчанию `None`, в этом случае используется [`Message`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message).120121Новое в версии 3.6.122123#### `verify_generated_headers`124125Если `True` (по умолчанию), генератор возбудит исключение [`HeaderWriteError`](https://python-all.ru/3.9/library/email.errors.html#email.errors.HeaderWriteError) вместо записи заголовка, который неправильно свёрнут или разграничен, так что он может быть разобран как несколько заголовков или объединён с соседними данными. Такие заголовки могут быть созданы пользовательскими классами заголовков или ошибками в модуле `email`.126127Поскольку это функция безопасности, по умолчанию используется `True` даже в политике [`Compat32`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Compat32). Для совместимости с предыдущими версиями, но небезопасного поведения, необходимо явно установить значение `False`.128129Новое в версии 3.9.20.130131Следующий метод [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy) предназначен для вызова из кода, использующего библиотеку email, для создания экземпляров политики с пользовательскими настройками:132133#### `clone(**kw)`134135Возвращает новый экземпляр [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy), атрибуты которого имеют те же значения, что и у текущего экземпляра, за исключением тех атрибутов, которым присвоены новые значения через именованные аргументы.136137Остальные методы [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy) вызываются кодом пакета email и не предназначены для вызова из приложения, использующего пакет email. Пользовательская политика должна реализовывать все эти методы.138139#### `handle_defect(obj, defect)`140141Обрабатывает *дефект*, обнаруженный в *obj*. Когда пакет email вызывает этот метод, *defect* всегда будет подклассом `Defect`.142143Реализация по умолчанию проверяет флаг [`raise_on_defect`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.raise_on_defect). Если он равен `True`, *defect* возбуждается как исключение. Если он равен `False` (по умолчанию), *obj* и *defect* передаются в [`register_defect()`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.register_defect).144145#### `register_defect(obj, defect)`146147Регистрирует *дефект* для *obj*. В пакете email *defect* всегда будет подклассом `Defect`.148149Реализация по умолчанию вызывает метод `append` атрибута `defects` объекта *obj*. Когда пакет email вызывает [`handle_defect`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.handle_defect), объект *obj* обычно имеет атрибут `defects`, который содержит метод `append`. Пользовательские типы объектов, используемые с пакетом email (например, пользовательские объекты `Message`), также должны предоставлять такой атрибут, иначе дефекты в разобранных сообщениях приведут к неожиданным ошибкам.150151#### `header_max_count(name)`152153Возвращает максимально допустимое количество заголовков с именем *name*.154155Вызывается при добавлении заголовка в объект [`EmailMessage`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage) или [`Message`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message). Если возвращаемое значение не равно `0` или `None`, и уже существует количество заголовков с именем *name*, большее или равное возвращённому значению, возбуждается исключение [`ValueError`](https://python-all.ru/3.9/library/exceptions.html#ValueError).156157Поскольку поведение по умолчанию `Message.__setitem__` заключается в добавлении значения в список заголовков, можно легко создать дубликаты заголовков, не замечая этого. Этот метод позволяет ограничить количество экземпляров определённых заголовков, которые могут быть добавлены в объект `Message` программно. (Ограничение не учитывается парсером, который честно воспроизведёт столько заголовков, сколько есть в разбираемом сообщении.)158159Реализация по умолчанию возвращает `None` для всех имён заголовков.160161#### `header_source_parse(sourcelines)`162163Пакет email вызывает этот метод со списком строк, каждая из которых заканчивается символами разделения строк, найденными в разбираемом источнике. Первая строка включает имя заголовка поля и разделитель. Все пробельные символы в источнике сохраняются. Метод должен возвращать кортеж `(name, value)`, который будет сохранён в `Message` для представления разобранного заголовка.164165Если реализация хочет сохранить совместимость с существующими политиками пакета email, *name* должно быть именем с сохранением регистра (все символы до разделителя ‘`:`’), а *value* – развёрнутым значением (все символы разделителей строк удалены, но пробелы сохранены), с удалёнными начальными пробельными символами.166167*sourcelines* может содержать двоичные данные, экранированные суррогатами.168169Реализация по умолчанию отсутствует170171#### `header_store_parse(name, value)`172173Пакет email вызывает этот метод с именем и значением, предоставленными прикладной программой, когда она программно изменяет объект `Message` (в отличие от `Message`, созданного парсером). Метод должен возвращать кортеж `(name, value)`, который будет сохранён в `Message` для представления заголовка.174175Если реализация хочет сохранить совместимость с существующими политиками пакета email, *name* и *value* должны быть строками или подклассами строк, которые не изменяют содержимое переданных аргументов.176177Реализация по умолчанию отсутствует178179#### `header_fetch_parse(name, value)`180181Пакет email вызывает этот метод с *именем* и *значением*, хранящимися в данный момент в `Message`, когда заголовок запрашивается прикладной программой, и то, что возвращает метод, передаётся обратно приложению в качестве значения запрашиваемого заголовка. Обратите внимание, что в `Message` может быть несколько заголовков с одним и тем же именем; методу передаются конкретные имя и значение заголовка, который будет возвращён приложению.182183*value* может содержать бинарные данные с суррогатным экранированием. В возвращаемом методом значении не должно быть таких бинарных данных.184185Реализация по умолчанию отсутствует186187#### `fold(name, value)`188189Пакет email вызывает этот метод с *именем* и *значением*, хранящимися в данный момент в `Message` для заданного заголовка. Метод должен вернуть строку, которая представляет этот заголовок, «сложенный» (folded) правильно (в соответствии с настройками политики) путём составления *имени* с *значением* и вставки символов [`linesep`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.linesep) в нужных местах. См. [**RFC 5322**](https://python-all.ru/3.9/library/email.policy.html) для обсуждения правил сворачивания заголовков электронной почты.190191*value* может содержать бинарные данные с суррогатным экранированием. В возвращаемой методом строке не должно быть таких бинарных данных.192193#### `fold_binary(name, value)`194195То же, что и [`fold()`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.fold), за исключением того, что возвращаемое значение должно быть объектом bytes, а не строкой.196197*value* может содержать бинарные данные с суррогатным экранированием. Они могут быть преобразованы обратно в бинарные данные в возвращаемом байтовом объекте.198199#### `class email.policy.EmailPolicy(**kw)`200201Этот конкретный [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy) обеспечивает поведение, которое должно полностью соответствовать текущим RFC электронной почты. Они включают (но не ограничиваются) [**RFC 5322**](https://python-all.ru/3.9/library/email.policy.html), [**RFC 2047**](https://python-all.ru/3.9/library/email.policy.html) и текущим RFC MIME.202203Эта политика добавляет новые алгоритмы разбора и сворачивания заголовков. Вместо простых строк заголовки являются `str` подклассами с атрибутами, которые зависят от типа поля. Алгоритмы разбора и сворачивания полностью реализуют [**RFC 2047**](https://python-all.ru/3.9/library/email.policy.html) и [**RFC 5322**](https://python-all.ru/3.9/library/email.policy.html).204205Значением по умолчанию для атрибута [`message_factory`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.message_factory) является [`EmailMessage`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage).206207В дополнение к настраиваемым атрибутам, перечисленным выше и относящимся ко всем политикам, эта политика добавляет следующие дополнительные атрибуты:208209Новое в версии 3.6: [1](https://python-all.ru/3.9/library/email.policy.html#id2)210211#### `utf8`212213If `False`, follow [**RFC 5322**](https://python-all.ru/3.9/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.9/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.9/library/email.policy.html)).214215#### `refold_source`216217Если значение заголовка в объекте `Message` получено из [`parser`](https://python-all.ru/3.9/library/email.parser.html#module-email.parser) (а не установлено программой), этот атрибут указывает, должен ли генератор заново сворачивать это значение при преобразовании сообщения обратно в сериализованную форму. Возможные значения:218219| `none` | все исходные значения используют исходное сворачивание |220| --- | --- |221| `long` | исходные значения, имеющие строки длиннее `max_line_length`, будут свёрнуты заново |222| `all` | все значения сворачиваются заново. |223224Значение по умолчанию: `long`.225226#### `header_factory`227228A 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.9/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.9/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.229230#### `content_manager`231232Объект как минимум с двумя методами: get\_content и set\_content. Когда вызывается метод [`get_content()`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage.get_content) или [`set_content()`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage.set_content) объекта [`EmailMessage`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage), он вызывает соответствующий метод этого объекта, передавая ему объект сообщения в качестве первого аргумента, а также любые аргументы или ключевые слова, переданные ему как дополнительные аргументы. По умолчанию `content_manager` устанавливается в [`raw_data_manager`](https://python-all.ru/3.9/library/email.contentmanager.html#email.contentmanager.raw_data_manager).233234Новое в версии 3.4.235236Класс предоставляет следующие конкретные реализации абстрактных методов [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy):237238#### `header_max_count(name)`239240Возвращает значение атрибута [`max_count`](https://python-all.ru/3.9/library/email.headerregistry.html#email.headerregistry.BaseHeader.max_count) специализированного класса, используемого для представления заголовка с данным именем.241242#### `header_source_parse(sourcelines)`243244Имя разбирается как всё до символа '`:`' и возвращается без изменений. Значение определяется путём удаления ведущих пробелов из остатка первой строки, объединения всех последующих строк вместе и удаления любых завершающих символов возврата каретки или перевода строки.245246#### `header_store_parse(name, value)`247248Имя возвращается без изменений. Если входное значение имеет атрибут `name` и он совпадает с *именем* без учёта регистра, значение возвращается без изменений. В противном случае *имя* и *значение* передаются в `header_factory`, и возвращается полученный объект заголовка в качестве значения. В этом случае возбуждается `ValueError`, если входное значение содержит символы CR или LF.249250#### `header_fetch_parse(name, value)`251252Если значение имеет атрибут `name`, оно возвращается без изменений. В противном случае *имя* и *значение* с удалёнными символами CR или LF передаются в `header_factory`, и возвращается полученный объект заголовка. Любые байты с суррогатным экранированием превращаются в глиф неизвестного символа Unicode.253254#### `fold(name, value)`255256Свёртка заголовков управляется настройкой политики [`refold_source`](https://python-all.ru/3.9/library/email.policy.html#email.policy.EmailPolicy.refold_source). Значение считается «исходным значением» тогда и только тогда, когда у него нет атрибута `name` (наличие атрибута `name` означает, что это объект заголовка того или иного вида). Если исходное значение необходимо пересвернуть в соответствии с политикой, оно преобразуется в объект заголовка путём передачи *имени* и *значения* (с удалёнными символами CR и LF) в `header_factory`. Свёртка объекта заголовка выполняется вызовом его метода `fold` с текущей политикой.257258Исходные значения разбиваются на строки с помощью [`splitlines()`](https://python-all.ru/3.9/library/stdtypes.html#str.splitlines). Если значение не требуется пересвёртывать, строки объединяются обратно с использованием `linesep` из политики и возвращаются. Исключение составляют строки, содержащие не-ASCII двоичные данные. В этом случае значение пересвёртывается независимо от настройки `refold_source`, что приводит к кодированию двоичных данных с помощью CTE с использованием кодировки `unknown-8bit`.259260#### `fold_binary(name, value)`261262То же, что и [`fold()`](https://python-all.ru/3.9/library/email.policy.html#email.policy.EmailPolicy.fold), если [`cte_type`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.cte_type) равно `7bit`, за исключением того, что возвращаемое значение – байты.263264Если [`cte_type`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy.cte_type) равно `8bit`, не-ASCII двоичные данные преобразуются обратно в байты. Заголовки с двоичными данными не пересвёртываются независимо от настройки `refold_header`, так как невозможно определить, состоят ли двоичные данные из однобайтовых или многобайтовых символов.265266Следующие экземпляры [`EmailPolicy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.EmailPolicy) предоставляют значения по умолчанию, подходящие для конкретных прикладных областей. Обратите внимание, что в будущем поведение этих экземпляров (в частности экземпляра `HTTP`) может быть скорректировано для ещё более точного соответствия RFC, относящимся к их областям.267268#### `email.policy.default`269270Экземпляр `EmailPolicy` со всеми значениями по умолчанию без изменений. Эта политика использует стандартные для Python окончания строк `\n` вместо правильных по RFC `\r\n`.271272#### `email.policy.SMTP`273274Подходит для сериализации сообщений в соответствии с RFC электронной почты. Как `default`, но с `linesep`, установленным в `\r\n`, что соответствует RFC.275276#### `email.policy.SMTPUTF8`277278То же, что и `SMTP`, за исключением того, что [`utf8`](https://python-all.ru/3.9/library/email.policy.html#email.policy.EmailPolicy.utf8) равно `True`. Полезно для сериализации сообщений в хранилище без использования закодированных слов в заголовках. Следует использовать только для передачи по SMTP, если адреса отправителя или получателя содержат символы, не входящие в ASCII (метод [`smtplib.SMTP.send_message()`](https://python-all.ru/3.9/library/smtplib.html#smtplib.SMTP.send_message) обрабатывает это автоматически).279280#### `email.policy.HTTP`281282Подходит для сериализации заголовков для использования в HTTP-трафике. Как `SMTP`, за исключением того, что `max_line_length` установлено в `None` (неограниченно).283284#### `email.policy.strict`285286Удобный экземпляр. То же, что и `default`, за исключением того, что `raise_on_defect` установлено в `True`. Это позволяет сделать любую политику строгой, написав:287288```python289somepolicy + policy.strict290```291292Со всеми этими [`EmailPolicies`](https://python-all.ru/3.9/library/email.policy.html#email.policy.EmailPolicy) действующий API пакета email изменяется по сравнению с API Python 3.2 следующим образом:293294> - Установка заголовка в [`Message`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message) приводит к разбору этого заголовка и созданию объекта заголовка.295> - Получение значения заголовка из [`Message`](https://python-all.ru/3.9/library/email.compat32-message.html#email.message.Message) приводит к разбору этого заголовка и созданию объекта заголовка, который затем возвращается.296> - Любой объект заголовка или любой заголовок, который пересвёртывается в соответствии с настройками политики, свёртывается с использованием алгоритма, полностью реализующего алгоритмы свёртки RFC, включая знание того, где требуются и разрешены закодированные слова.297298С точки зрения приложения это означает, что любой заголовок, полученный через [`EmailMessage`](https://python-all.ru/3.9/library/email.message.html#email.message.EmailMessage), является объектом заголовка с дополнительными атрибутами, строковое значение которого – полностью декодированное значение заголовка в Unicode. Аналогично, заголовку может быть присвоено новое значение или создан новый заголовок с использованием строки Unicode, и политика позаботится о преобразовании строки Unicode в правильную закодированную форму RFC.299300Объекты заголовков и их атрибуты описаны в [`headerregistry`](https://python-all.ru/3.9/library/email.headerregistry.html#module-email.headerregistry).301302#### `class email.policy.Compat32(**kw)`303304Этот конкретный [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy) является политикой обратной совместимости. Он воспроизводит поведение пакета email в Python 3.2. Модуль [`policy`](https://python-all.ru/3.9/library/email.policy.html#module-email.policy) также определяет экземпляр этого класса, [`compat32`](https://python-all.ru/3.9/library/email.policy.html#email.policy.compat32), который используется в качестве политики по умолчанию. Таким образом, поведение пакета email по умолчанию – сохранять совместимость с Python 3.2.305306Следующие атрибуты имеют значения, отличные от значения по умолчанию [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy):307308#### `mangle_from_`309310Значение по умолчанию: `True`.311312Класс предоставляет следующие конкретные реализации абстрактных методов [`Policy`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Policy):313314#### `header_source_parse(sourcelines)`315316Имя разбирается как всё до символа '`:`' и возвращается без изменений. Значение определяется путём удаления ведущих пробелов из остатка первой строки, объединения всех последующих строк вместе и удаления любых завершающих символов возврата каретки или перевода строки.317318#### `header_store_parse(name, value)`319320Имя и значение возвращаются без изменений.321322#### `header_fetch_parse(name, value)`323324Если значение содержит двоичные данные, оно преобразуется в объект [`Header`](https://python-all.ru/3.9/library/email.header.html#email.header.Header) с использованием кодировки `unknown-8bit`. В противном случае оно возвращается без изменений.325326#### `fold(name, value)`327328Заголовки сворачиваются с помощью алгоритма свёртки [`Header`](https://python-all.ru/3.9/library/email.header.html#email.header.Header), который сохраняет существующие переносы строк в значении и оборачивает каждую результирующую строку до `max_line_length`. Не-ASCII двоичные данные кодируются с помощью CTE с использованием кодировки `unknown-8bit`.329330#### `fold_binary(name, value)`331332Заголовки сворачиваются с помощью алгоритма свёртки [`Header`](https://python-all.ru/3.9/library/email.header.html#email.header.Header), который сохраняет существующие переносы строк в значении и оборачивает каждую результирующую строку до `max_line_length`. Если `cte_type` равно `7bit`, не-ASCII двоичные данные кодируются с помощью CTE с использованием кодировки `unknown-8bit`. В противном случае используется исходный заголовок с его существующими переносами строк и любыми (не соответствующими RFC) двоичными данными, которые он может содержать.333334#### `email.policy.compat32`335336Экземпляр [`Compat32`](https://python-all.ru/3.9/library/email.policy.html#email.policy.Compat32), обеспечивающий обратную совместимость с поведением пакета email в Python 3.2.337338Сноски339340**[1](https://python-all.ru/3.9/library/email.policy.html#id1)**341342Изначально добавлено в версии 3.3 как [экспериментальная функция](https://python-all.ru/3.9/glossary.html#term-provisional-package).343