email.headerregistry: Пользовательские объекты заголовка¶
Исходный код: Lib/email/headerregistry.py
Добавлено в версии 3.6: [1]
Заголовки представлены настраиваемыми подклассы str. Особый класс
используемый, чтобы представлять данный заголовок определен header_factory
policy в действительности, когда заголовки созданы. Этот раздел
документирует особый header_factory, осуществленный почтовым пакетом для обработки
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, обнаруженных во время парсинг. Пакет электронной почты пытается быть полным для обнаружения проблем соответствия. Для получения информации о типах дефектов, о которых можно сообщить, см. модульerrors.
-
max_count¶ Максимальное число заголовков этого типа, которые могут иметь одинаковый
name. значениеNoneозначает неограниченный.BaseHeaderзначение для этого атрибут являетсяNone; ожидается, что специализированные классы заголовка отвергнут этот значение по мере необходимости.
BaseHeaderтакже предоставляет следующий метод, который вызывается библиотекой электронной почты код и обычно не должен вызываться прикладными программами:-
fold(*, policy)¶ Возвращает строка, содержащий символы
linesep, необходимые для правильного сворачивания заголовка в соответствии с policy.cte_type8bitбудет рассматриваться как7bit, так как заголовки могут не содержать произвольных двоичных данных. Еслиutf8являетсяFalse, данные, не являющиеся данными ASCII, будут RFC 2047 кодированный.
BaseHeaderсамо по себе не может быть используемый для создания объекта заголовка. Он определяет протокол, с которым взаимодействует каждый специализированный заголовок для создания объекта заголовка. В частности,BaseHeaderтребует, чтобы специализированный класс предоставилclassmethod()с именемparse. Этот метод называется следующим образом:parse(string, kwds)
kwds- словарь, содержащий один предварительно инициализированный ключdefects.defectsявляется пустым списком. Метод синтаксического анализа должен добавлять обнаруженные дефекты в этот список. По возвращению словарьkwdsmust содержат значения, по крайней мере, для ключейdecodedиdefects.decodedдолжен быть строка значение для заголовка (то есть, заголовок значение, полностью расшифрованный к unicode). Метод разбора должен предположить, что string может содержать content- transfer-кодированный части, но должен правильно обращаться со всеми действительными unicode знаками также так, чтобы он мог разобрать un-кодированный заголовок значения.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 для неструктурированного текста. В парсер используется эвристика для дешифрования некоторых несовместимых кодированный слов. В таких случаях регистрируются дефекты, а также дефекты в таких вопросах, как недопустимые символы в кодированный словах или тексте non-кодированный.Этот тип заголовка не предоставляет дополнительных атрибуты.
-
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.
-
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.
В качестве удобства вместо addr_spec и username можно указать domain, в этом случае username и domain будут проанализированы из addr_spec. addr_spec должен быть надлежащим RFC-кодом строка; если он не является
Addressвызовет ошибку. Символы юникода разрешены и будут свойством кодированный при сериализации. Однако за RFCs, 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представляет единственный адрес, которого нет в группе.
-
Сноски
| [1] | Первоначально добавлен в 3.3 как временный модуль |
