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_type8bitбудет обрабатываться так, как если бы оно было7bit, поскольку заголовки не могут содержать произвольные двоичные данные. Еслиutf8равноFalse, данные, не являющиеся ASCII, будут закодированы в соответствии с RFC 2047.
Сам по себе
BaseHeaderнельзя использовать для создания объекта заголовка. Он определяет протокол, которому следует каждый специализированный заголовок для создания объекта заголовка. В частности,BaseHeaderтребует, чтобы специализированный класс предоставлялclassmethod()с именемparse. Этот метод вызывается следующим образом:parse(string, kwds)
kwds— это словарь, содержащий один предварительно инициализированный ключ,defects.defects— пустой список. Метод разбора должен добавлять в этот список все обнаруженные дефекты. При возврате словарьkwdsдолжен содержать значения как минимум для ключейdecoded,defectsиparse_tree.decodedдолжно быть строковым значением заголовка (то есть значением заголовка, полностью декодированным в строку). Вparse_treeпомещается дерево разбора, полученное при разборе заголовка. Метод разбора должен исходить из того, что string может содержать части, закодированные методом кодирования передачи содержимого, но при этом должен корректно обрабатывать и все допустимые символы Unicode, чтобы разбирать незакодированные значения заголовков.Затем
BaseHeaderс помощью своего__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.ContentTransferEncodingHeader -
Обрабатывает заголовок 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_map равноTrue(значение по умолчанию), при инициализации в реестр копируется стандартное соответствие имен заголовков классам. 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вызовет ошибку. Символы Unicode разрешены и будут корректно закодированы при сериализации. Однако согласно RFC символы Unicode не допускаются в части адреса, содержащей имя пользователя.-
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__() -
Значение
strобъектаGroupформатируется в соответствии с RFC 5322, но без кодирования передачи содержимого для любых символов, отличных от ASCII. Еслиdisplay_nameне задано и в спискеaddressesсодержится одинAddress, то значениеstrбудет совпадать со значениемstrэтого единственногоAddress.
-
Сноски
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/email.headerregistry.html