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)¶ Имя и Значение передаются в
BaseHeaderиз вызоваheader_factory. Строковое значение любого объекта заголовка - это значение, полностью декодированное в юникод.Этот базовый класс определяет следующие свойства, доступные только для чтения:
-
name¶ Имя заголовка (часть поля перед „:“). Это в точности то же значение, которое было передано в вызове
header_factoryдля name; то есть регистр сохраняется.
-
defects¶ Кортеж экземпляров
HeaderDefect, сообщающий о любых проблемах с соответствием RFC, обнаруженных при разборе. Пакет email старается быть полным в обнаружении проблем соответствия. См. модульerrorsдля обсуждения типов дефектов, о которых может быть сообщено.
-
max_count¶ Максимальное количество заголовков данного типа, которые могут иметь одинаковое значение
name. ЗначениеNoneозначает неограниченное количество. ЗначениеBaseHeaderдля этого атрибута равноNone; ожидается, что специализированные классы заголовков будут переопределять это значение по мере необходимости.
BaseHeaderтакже предоставляет следующий метод, который вызывается кодом библиотеки электронной почты и в общем случае не должен вызываться прикладными программами:-
fold(*, policy)¶ Возвращает строку, содержащую
linesepсимволов, необходимых для корректного сворачивания заголовка в соответствии с policy. Еслиcte_typeиз8bitбудет рассматриваться как7bit, поскольку заголовки не могут содержать произвольные двоичные данные. Еслиutf8являетсяFalse, данные, не относящиеся к кодировке ASCII, будут закодированы RFC 2047.
BaseHeaderсам по себе не может быть использован для создания объекта заголовка. Он определяет протокол, с которым сотрудничает каждый специализированный заголовок для создания объекта заголовка. В частности,BaseHeaderтребует, чтобы специализированный класс предоставилclassmethod()с именемparse. Этот метод вызывается следующим образом:parse(string, kwds)
kwds- словарь, содержащий один предварительно инициализированный ключdefects.defects- пустой список. Метод разбора должен добавить все обнаруженные дефекты в этот список. По возвращении словарьkwdsдолжен содержать значения по крайней мере для ключейdecodedиdefects.decodedдолжен быть строковым значением заголовка (то есть значением заголовка, полностью декодированным в юникод). Метод разбора должен предполагать, что string может содержать части, закодированные передачей содержимого, но должен правильно обрабатывать все допустимые символы юникода, чтобы можно было разобрать некодированные значения заголовка.Затем
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 символов в значении заголовка. Когда конструктору передается значение, содержащее кодированные слова, синтаксический анализатор
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, значение может быть экземпляром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устанавливается путемjoiningstrзначения элементов атрибута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__генерируемых классов.По умолчанию используются следующие сопоставления:
- тема
UniqueUnstructuredHeader
- дата
UniqueDateHeader
- дата отправки
DateHeader
- дата происхождения
UniqueDateHeader
- отправитель
UniqueSingleAddressHeader
- отправитель
SingleAddressHeader
- на
UniqueAddressHeader
- resent-to
AddressHeader
- cc
UniqueAddressHeader
- resent-cc
AddressHeader
- bcc
UniqueAddressHeader
- resent-bcc
AddressHeader
- с сайта
UniqueAddressHeader
- resent-from
AddressHeader
- ответ на
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, но без кодировки Content Transfer Encoding любых не-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и есть ровно одинAddressвaddresses, тоGroupпредставляет один адрес, который не входит в группу.
-
Сноски
- 1
Первоначально был добавлен в 3.3 как provisional module.