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.
Для удобства можно указать addr_spec вместо username и domain, в этом случае username и domain будут извлечены из addr_spec. addr_spec должен быть корректно закодированной строкой по RFC; если это не так,
Addressсгенерирует ошибку. Разрешённые символы Юникода будут корректно закодированы при сериализации. Однако согласно RFC, символы Юникода не разрешены в части username адреса.-
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и существует ровно одинAddressвaddresses, тогда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.11/library/email.headerregistry.html