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, полностью декодированное в Unicode.Этот базовый класс определяет следующие только для чтения свойства:
-
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должно быть строковым значением для заголовка (то есть значение заголовка, полностью декодированное в Unicode). Метод parse должен предполагать, что string может содержать закодированные части, но должен правильно обрабатывать все допустимые символы Unicode, чтобы он мог анализировать незакодированные значения заголовков.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преобразует такие закодированные слова в Unicode, следуя правилам 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устанавливается с помощьюjoinзначений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.
Для удобства можно указать addr_spec вместо username и domain, в этом случае 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 -
Имя группы для отображения. Если оно
Noneи вaddressesсодержится ровно одинAddress, тоGroupпредставляет собой отдельный адрес, не входящий в группу.
-
addresses -
Возможный пустой кортеж объектов
Address, представляющих адреса в группе.
-
__str__() -
Значение
strGroupформатируется в соответствии с RFC 5322, но без кодировки переноса содержимого для любых не-ASCII символов. Еслиdisplay_nameравно None и в спискеaddressesсодержится одинAddress, значениеstrбудет таким же, как значениеstrэтого одногоAddress.
-
Примечания
-
1 -
Первоначально добавлен в 3.3 как провизорный модуль
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/email.headerregistry.html