email.headerregistry: Объекты пользовательских заголовков
Исходный код: Lib/email/headerregistry.py
Добавлена в версии 3.6: [1]
Заголовки представлены настраиваемыми подклассами str. Конкретный класс, используемый для представления данного заголовка, определяется header_factory используемой policy политики в момент создания заголовков. В данном разделе документированы конкретные header_factory реализации пакета email для обработки RFC 5322 совместимых сообщений электронной почты, которые не только предоставляют настраиваемые объекты заголовков для различных типов заголовков, но и обеспечивают механизм расширения для приложений для добавления собственных пользовательских типов заголовков.
При использовании любого из объектов политики, производных от EmailPolicy, все заголовки генерируются HeaderRegistry и имеют BaseHeader в качестве своего базового класса. Каждый класс заголовка имеет дополнительный базовый класс, определяемый типом заголовка. Например, многие заголовки имеют класс UnstructuredHeader в качестве другого базового класса. Специализированный второй класс для заголовка определяется именем заголовка, используя таблицу поиска, хранящуюся в HeaderRegistry. Всё это управляется прозрачно для типичной программы-приложения, но для более сложных приложений предоставляются интерфейсы для изменения поведения по умолчанию.
В разделах ниже сначала документируются базовые классы заголовков и их атрибуты, затем API для изменения поведения HeaderRegistry, и, наконец, поддерживающие классы, используемые для представления данных, извлеченных из структурированных заголовков.
-
class email.headerregistry.BaseHeader(name, value) -
name и value передаются
BaseHeaderиз вызоваheader_factory. Строковое значение любого объекта заголовка — это value, полностью декодированное в юникод.Этот базовый класс определяет следующие только для чтения свойства:
-
name -
Имя заголовка (часть поля перед ‘:’). Это точно то значение, которое передаётся в вызов
header_factoryдля name; при этом регистр сохраняется.
-
defects -
Кортеж экземпляров
HeaderDefect, сообщающих о любых проблемах соответствия RFC, обнаруженных во время разбора. Пакет email старается полностью обнаруживать проблемы соответствия. См. модульerrorsдля обсуждения типов дефектов, которые могут быть сообщены.
-
max_count -
Максимальное количество заголовков этого типа, которые могут иметь одинаковое
name. ЗначениеNoneозначает неограниченное количество. ЗначениеBaseHeaderдля этого атрибута —None; ожидается, что специализированные классы заголовков переопределят это значение по мере необходимости.
BaseHeaderтакже предоставляет следующий метод, который вызывается кодом библиотеки email и, как правило, не должен вызываться программами-приложениями:-
fold(*, policy) -
Возвращает строку, содержащую символы
linesep, как требуется для правильного сгиба заголовка в соответствии с политикой policy.cte_typeзначения8bitбудет обрабатываться так, как если бы это было7bit, поскольку заголовки не могут содержать произвольные двоичные данные. Еслиutf8равноFalse, данные, не являющиеся ASCII, будут кодированы по RFC 2047.
BaseHeaderсам по себе не может использоваться для создания объекта заголовка. Он определяет протокол, с которым каждый специализированный заголовок сотрудничает для создания объекта заголовка. В частности,BaseHeaderтребует, чтобы специализированный класс предоставилclassmethod()с именемparse. Этот метод вызывается следующим образом:parse(string, kwds)
kwds— это словарь, содержащий один предварительно инициализированный ключ,defects.defects— это пустой список. Метод parse должен добавлять любые обнаруженные дефекты в этот список. При возврате словарьkwdsобязательно должен содержать значения для ключейdecodedиdefects.decodedдолжно быть строковым значением для заголовка (то есть значением заголовка, полностью декодированным в юникод). Метод parse должен предполагать, что string может содержать части с кодированием содержимого, но должен правильно обрабатывать все допустимые символы юникода, чтобы он мог анализировать значения заголовков без кодирования.BaseHeader’s__new__затем создаёт экземпляр заголовка и вызывает его методinit. Специализированный класс нуждается в методеinitтолько если он хочет установить дополнительные атрибуты помимо тех, которые предоставляет самBaseHeader. Такой методinitдолжен выглядеть так:def init(self, /, *args, **kw): self._myattr = kw.pop('myattr') super().init(*args, **kw)То есть всё лишнее, что специализированный класс добавляет в словарь
kwds, должно быть удалено и обработано, а оставшееся содержимоеkw(иargs) передаётся методуBaseHeaderinit. -
-
class email.headerregistry.UnstructuredHeader -
«Неструктурированный» заголовок — это тип заголовка по умолчанию в RFC 5322. Любой заголовок, не имеющий указанного синтаксиса, обрабатывается как неструктурированный. Классическим примером неструктурированного заголовка является заголовок Subject.
В RFC 5322 неструктурированный заголовок представляет собой последовательность произвольных символов в наборе символов ASCII. RFC 2047, однако, имеет механизм, совместимый с RFC 5322, для кодирования текста, не являющегося ASCII, как символы ASCII внутри значения заголовка. При передаче в конструктор value, содержащего закодированные слова, анализатор
UnstructuredHeaderпреобразует такие закодированные слова в юникод, следуя правилам RFC 2047 для неструктурированного текста. Парсер использует эвристику для попытки декодирования определённых несоответствующих закодированных слов. В таких случаях регистрируются дефекты, а также дефекты для таких проблем, как недопустимые символы внутри закодированных слов или некодированного текста.Этот тип заголовка не предоставляет дополнительных атрибутов.
-
class email.headerregistry.DateHeader -
RFC 5322 определяет очень специфический формат дат в заголовках электронных писем. Парсер
DateHeaderраспознаёт этот формат даты, а также ряд вариантов, иногда встречающихся «в дикой природе».Этот тип заголовка предоставляет следующие дополнительные атрибуты:
-
datetime -
Если значение заголовка можно распознать как действительную дату одного из форматов, этот атрибут будет содержать экземпляр
datetime, представляющий эту дату. Если часовой пояс входной даты указан как-0000(указывающий, что это UTC, но не содержащий информации о часовом поясе источника), тогдаdatetimeбудет простымdatetime. Если обнаружен конкретный смещение часового пояса (включая+0000), тоdatetimeбудет содержать осознанныйdatetime, который используетdatetime.timezoneдля записи смещения часового пояса.
Значение
decodedзаголовка определяется с помощью форматированияdatetimeв соответствии с правилами RFC 5322; то есть, оно устанавливается следующим образом:email.utils.format_datetime(self.datetime)
При создании
DateHeader, value может быть экземпляромdatetime. Это означает, например, что следующий код допустим и делает то, что ожидается:msg['Date'] = datetime(2011, 7, 15, 21)
Поскольку это простой
datetime, он будет интерпретироваться как метка времени UTC, и результирующее значение будет иметь часовой пояс-0000. Гораздо полезнее использовать функциюlocaltime()из модуляutils:msg['Date'] = utils.localtime()
Этот пример устанавливает заголовок даты на текущее время и дату с использованием текущего смещения часового пояса.
-
-
class email.headerregistry.AddressHeader -
Заголовки адресов являются одним из самых сложных типов структурированных заголовков. Класс
AddressHeaderпредоставляет общий интерфейс для любого заголовка адреса.Этот тип заголовка предоставляет следующие дополнительные атрибуты:
-
groups -
Кортеж объектов
Group, кодирующих адреса и группы, найденные в значении заголовка. Адреса, которые не являются частью группы, представлены в этом списке как одноадресныеGroupsсdisplay_nameравнымNone.
-
addresses -
Кортеж объектов
Address, кодирующих все индивидуальные адреса из значения заголовка. Если значение заголовка содержит какие-либо группы, индивидуальные адреса из группы включаются в список в точке, где группа встречается в значении (то есть, список адресов «сглаживается» в одномерный список).
Значение
decodedзаголовка будет иметь все закодированные слова, декодированные в юникод. Домены, закодированные вidnaтакже декодируются в юникод. Значениеdecodedустанавливается с помощью объединения значенияstrэлементов атрибутаgroupsс', '.Список объектов
AddressиGroupв любой комбинации может использоваться для установки значения заголовка адреса. ОбъектыGroup, у которыхdisplay_nameравноNone, будут интерпретироваться как отдельные адреса, что позволяет копировать список адресов с сохранением групп, используя список, полученный из атрибутаgroupsисходного заголовка. -
-
class email.headerregistry.SingleAddressHeader -
Подкласс
AddressHeader, добавляющий один дополнительный атрибут:-
address -
Единственный адрес, закодированный значением заголовка. Если значение заголовка фактически содержит более одного адреса (что нарушает RFC по умолчанию
policy), обращение к этому атрибуту приведет кValueError.
-
Многие из перечисленных классов также имеют вариант Unique (например, UniqueUnstructuredHeader). Единственное отличие заключается в том, что в варианте Unique max_count устанавливается в 1.
-
class email.headerregistry.MIMEVersionHeader -
Действительно, для заголовка MIME-Version существует только одно допустимое значение, и это
1.0. Для обеспечения будущей совместимости этот класс заголовка поддерживает другие допустимые номера версий. Если номер версии имеет допустимое значение в соответствии с RFC 2045, то объект заголовка будет иметь не-Noneзначения для следующих атрибутов:-
version -
Номер версии в виде строки, с удаленными пробелами и/или комментариями.
-
major -
Номер основной версии как целое число
-
minor -
Номер дополнительной версии как целое число
-
-
class email.headerregistry.ParameterizedMIMEHeader -
Все заголовки MIME начинаются с префикса ‘Content-’. Каждый конкретный заголовок имеет определенное значение, описанное в классе для этого заголовка. Некоторые также могут принимать список дополнительных параметров, которые имеют общий формат. Этот класс служит основой для всех заголовков MIME, которые принимают параметры.
-
params -
Словарь, сопоставляющий имена параметров со значениями параметров.
-
-
class email.headerregistry.ContentTypeHeader -
Класс
ParameterizedMIMEHeader, который обрабатывает заголовок Content-Type.-
content_type -
Строка типа содержимого в формате
maintype/subtype.
-
maintype
-
subtype
-
-
class email.headerregistry.ContentDispositionHeader -
Класс
ParameterizedMIMEHeader, который обрабатывает заголовок Content-Disposition.-
content_disposition -
inlineиattachmentявляются единственными допустимыми значениями, которые часто используются.
-
-
class email.headerregistry.ContentTransferEncoding -
Обрабатывает заголовок Content-Transfer-Encoding.
-
cte -
Допустимые значения —
7bit,8bit,base64, иquoted-printable. См. RFC 2045 для получения дополнительной информации.
-
-
class email.headerregistry.HeaderRegistry(base_class=BaseHeader, default_class=UnstructuredHeader, use_default_map=True) -
Это фабрика, используемая по умолчанию
EmailPolicy.HeaderRegistryсоздаёт класс, используемый для динамического создания экземпляра заголовка, используя base_class и специализированный класс, полученный из реестра. Если имя заголовка отсутствует в реестре, используется класс, указанный в default_class. Если use_default_mapTrue(по умолчанию), то стандартное соответствие имён заголовков классам копируется в реестр во время инициализации. base_class всегда является последним классом в списке__bases__генерируемого класса.Стандартные соответствия:
- subject:
-
UniqueUnstructuredHeader
- date:
-
UniqueDateHeader
- resent-date:
-
DateHeader
- orig-date:
-
UniqueDateHeader
- sender:
-
UniqueSingleAddressHeader
- resent-sender:
-
SingleAddressHeader
- to:
-
UniqueAddressHeader
- resent-to:
-
AddressHeader
- cc:
-
UniqueAddressHeader
- resent-cc:
-
AddressHeader
- bcc:
-
UniqueAddressHeader
- resent-bcc:
-
AddressHeader
- from:
-
UniqueAddressHeader
- resent-from:
-
AddressHeader
- reply-to:
-
UniqueAddressHeader
- mime-version:
-
MIMEVersionHeader
- content-type:
-
ContentTypeHeader
- content-disposition:
-
ContentDispositionHeader
- content-transfer-encoding:
-
ContentTransferEncodingHeader
- message-id:
-
MessageIDHeader
HeaderRegistryимеет следующие методы:-
map_to_type(self, name, cls) -
name — имя заголовка для сопоставления. В реестре оно будет преобразовано в нижний регистр. cls — специализированный класс, используемый вместе с base_class для создания класса, используемого для создания экземпляров заголовков, соответствующих name.
-
__getitem__(name) -
Создаёт и возвращает класс для обработки создания заголовка name.
-
__call__(name, value) -
Получает специализированный заголовок, связанный с name из реестра (используя default_class, если name отсутствует в реестре), и комбинирует его с base_class для создания класса, вызывает конструктор созданного класса, передавая ему тот же список аргументов, и, наконец, возвращает созданный таким образом экземпляр класса.
Следующие классы используются для представления данных, извлеченных из структурированных заголовков, и, как правило, могут использоваться приложением для построения структурированных значений для назначения определенным заголовкам.
-
class email.headerregistry.Address(display_name='', username='', domain='', addr_spec=None) -
Класс, используемый для представления электронного адреса. Общий вид адреса:
[display_name] <username@domain>
или:
username@domain
где каждая часть должна соответствовать определённым правилам синтаксиса, описанным в RFC 5322.
Для удобства вместо username и domain можно указать addr_spec, в этом случае username и domain будут извлечены из addr_spec. addr_spec должен быть правильно оформленной строкой RFC, в противном случае
Addressвыдаст ошибку. Разрешены символы Юникода, которые будут корректно закодированы при сериализации. Однако, согласно RFC, в части имени пользователя адреса символы Юникода не допускаются.-
display_name -
Часть имени адресата, если она есть, со всеми скобками удалены. Если у адреса нет имени адресата, это атрибут будет пустой строкой.
-
username -
Часть
usernameадреса со всеми скобками удалены.
-
domain -
Часть
domainадреса.
-
addr_spec -
Часть
username@domainадреса, правильно оформленная для использования в качестве простого адреса (второй вид, показанный выше). Этот атрибут не изменяемый.
-
__str__() -
Значение
strобъекта — это адрес, оформленный согласно правилам RFC 5322, но без кодирования символов, отличных от ASCII.
Для поддержки SMTP (RFC 5321),
Addressобрабатывает один специальный случай: еслиusernameиdomainобе пустые строки (илиNone), то строковое значениеAddressравно<>. -
-
class email.headerregistry.Group(display_name=None, addresses=None) -
Класс, используемый для представления группы адресов. Общий вид группы адресов:
display_name: [address-list];
Для удобства обработки списков адресов, состоящих из смеси групп и отдельных адресов,
Groupтакже может использоваться для представления отдельных адресов, которые не являются частью группы, установив display_name вNoneи предоставив список отдельных адресов как addresses.-
display_name -
Имя
display_nameгруппы. Если оноNoneи вaddressesровно одинAddress, тоGroupпредставляет собой один адрес, который не входит в группу.
-
addresses -
Возможный пустой кортеж
Addressобъектов, представляющих адреса в группе.
-
__str__() -
Значение
strGroupформатируется в соответствии с RFC 5322, но без кодирования символов, отличных от ASCII. Еслиdisplay_nameравно None и в спискеaddressesединственныйAddress, то значениеstrбудет таким же, как значениеstrэтого единственногоAddress.
-
Примечания
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/email.headerregistry.html