email.header: Международные заголовки
Исходный код: Lib/email/header.py
Этот модуль является частью устаревшего (Compat32) API для работы с электронной почтой. В текущем API кодирование и декодирование заголовков обрабатывается прозрачно с помощью подобного словарям API класса EmailMessage. Помимо использования в устаревшем коде, этот модуль может быть полезен в приложениях, которым требуется полный контроль над используемыми кодировками символов при кодировании заголовков.
Остальной текст в этом разделе — оригинальная документация модуля.
RFC 2822 — это базовый стандарт, описывающий формат сообщений электронной почты. Он произошёл от более старого стандарта RFC 822, который получил широкое распространение в то время, когда большинство электронных писем состояло только из символов ASCII. RFC 2822 — это спецификация, предполагающая, что электронное письмо содержит только символы ASCII 7-битной кодировки.
Конечно, поскольку электронная почта используется по всему миру, она стала интернационализированной, так что теперь в сообщениях электронной почты можно использовать наборы символов, специфичные для языка. Базовый стандарт всё ещё требует, чтобы сообщения электронной почты передавались только с помощью символов ASCII 7-битной кодировки, поэтому было написано множество RFC, описывающих, как кодировать электронные письма, содержащие несимволы ASCII, в RFC 2822-совместимом формате. Эти RFC включают RFC 2045, RFC 2046, RFC 2047 и RFC 2231. Пакет email поддерживает эти стандарты в своих модулях email.header и email.charset.
Если вы хотите включить символы, отличные от ASCII, в свои заголовки электронной почты, например, в поля Тема или Кому, вы должны использовать класс Header и присвоить поле в объекте Message экземпляру Header, вместо использования строки в качестве значения заголовка. Импортируйте класс Header из модуля email.header. Например:
>>> from email.message import Message
>>> from email.header import Header
>>> msg = Message()
>>> h = Header('p\xf6stal', 'iso-8859-1')
>>> msg['Subject'] = h
>>> msg.as_string()
'Subject: =?iso-8859-1?q?p=F6stal?=\n\n'
Обратите внимание, как мы хотели, чтобы поле Тема содержало символ, отличный от ASCII? Мы сделали это, создав экземпляр Header и передав в него набор символов, в котором была закодирована строка байтов. При последующем разложении экземпляра Message поле Тема было правильно закодировано по RFC 2047. Почтовые клиенты, поддерживающие MIME, отобразили бы этот заголовок с использованием встроенного символа ISO-8859-1.
Вот описание класса Header:
-
class email.header.Header(s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict') -
Создайте заголовок MIME, который может содержать строки в разных кодировках символов.
Необязательный параметр s — начальное значение заголовка. Если
None(по умолчанию), начальное значение заголовка не устанавливается. Позже вы можете добавить к заголовку с помощью вызовов методаappend(). s может быть экземпляромbytesилиstr, но см. документацию к методуappend()для семантики.Необязательный параметр charset выполняет две функции: он имеет то же значение, что и аргумент charset метода
append(). Он также устанавливает кодировку символов по умолчанию для всех последующих вызовов методаappend(), которые опускают аргумент charset. Если параметр charset не задан в конструкторе (по умолчанию), используется кодировкаus-asciiкак начальная кодировка символов s и как кодировка по умолчанию для последующих вызововappend().Максимальную длину строки можно явно задать через maxlinelen. Для разбиения первой строки на более короткое значение (чтобы учесть заголовок поля, который не включён в s, например, Тема) передайте имя поля в header_name. Значение maxlinelen по умолчанию — 76, а значение header_name по умолчанию —
None, что означает, что оно не учитывается для первой строки длинного, разрывного заголовка.Необязательный параметр continuation_ws должен быть совместимым с RFC 2822 пробелом перехода на новую строку, и обычно это либо пробел, либо табуляция. Этот символ будет предшествовать строкам продолжения. По умолчанию continuation_ws устанавливается в одиночный пробел.
Необязательный параметр errors передаётся напрямую в метод
append().-
append(s, charset=None, errors='strict') -
Добавить строку s к заголовку MIME.
Необязательный параметр charset, если задан, должен быть экземпляром
Charset(см.email.charset) или именем кодировки символов, которое будет преобразовано в экземплярCharset. ЗначениеNone(по умолчанию) означает, что используется charset, заданный в конструкторе.s может быть экземпляром
bytesилиstr. Если это экземплярbytes, то charset — это кодировка этой байтовой строки, и будет поднято исключениеUnicodeError, если строка не может быть декодирована с помощью этой кодировки символов.Если s является экземпляром
str, то charset — это подсказка, указывающая кодировку символов в строке.В любом случае, при создании заголовка, совместимого с RFC 2822 с использованием правил RFC 2047, строка будет закодирована с использованием кодировки вывода charset. Если строка не может быть закодирована с использованием кодировки вывода, будет поднято исключение UnicodeError.
Необязательный параметр errors передаётся как аргумент errors вызову decode, если s — это байтовая строка.
-
encode(splitchars=';, \t', maxlinelen=None, linesep='\n') -
Кодирует заголовок сообщения в формате, совместимом с RFC, возможно, обрезая длинные строки и инкапсулируя части вне ASCII в кодировки base64 или quoted-printable.
Необязательный параметр splitchars — это строка, содержащая символы, которым алгоритм разбиения должен уделять больше внимания при обычном обрезании заголовков. Это очень грубо поддерживает «синтаксические разрывы более высокого уровня» RFC 2822: точки разрыва, предваряемые символом разрыва, предпочтительнее во время разбиения строк, а символы предпочтительнее в порядке их появления в строке. Пробелы и табуляции могут быть включены в строку, чтобы указать, какой из них следует предпочесть другому как точку разрыва, когда другие символы разрыва не появляются в строке, которая разбивается. Символы разрыва не влияют на строки, закодированные в RFC 2047.
maxlinelen, если задан, переопределяет значение экземпляра для максимальной длины строки.
linesep указывает символы, используемые для разделения строк сложенного заголовка. По умолчанию используется наиболее полезное значение для кода Python-приложения (
\n), но\r\nможно указать, чтобы создать заголовки с разделителями строк, совместимыми с RFC.Изменено в версии 3.2: Добавлен аргумент linesep.
Класс
Headerтакже предоставляет ряд методов для поддержки стандартных операторов и встроенных функций.-
__str__() -
Возвращает приблизительное представление
Headerкак строки, используя неограниченную длину строки. Все части преобразуются в unicode с использованием заданной кодировки и объединяются соответствующим образом. Любые части с кодировкой'unknown-8bit'декодируются как ASCII с обработчиком ошибок'replace'.Изменено в версии 3.2: Добавлена обработка кодировки
'unknown-8bit'.
-
__eq__(other) -
Этот метод позволяет сравнивать два экземпляра
Headerна равенство.
-
__ne__(other) -
Этот метод позволяет сравнивать два экземпляра
Headerна неравенство.
-
Модуль email.header также предоставляет следующие удобные функции.
-
email.header.decode_header(header) -
Декодирует значение заголовка сообщения без преобразования кодировки символов. Значение заголовка находится в header.
Эта функция возвращает список
(decoded_string, charset)пар, содержащих каждую из декодированных частей заголовка. charset —Noneдля некодированных частей заголовка, иначе — строка в нижнем регистре, содержащая имя кодировки символов, указанное в закодированной строке.Вот пример:
>>> from email.header import decode_header >>> decode_header('=?iso-8859-1?q?p=F6stal?=') [(b'p\xf6stal', 'iso-8859-1')]
-
email.header.make_header(decoded_seq, maxlinelen=None, header_name=None, continuation_ws=' ') -
Создаёт экземпляр
Headerиз последовательности пар, как возвращаетdecode_header().decode_header()принимает строку значения заголовка и возвращает последовательность пар формата(decoded_string, charset)где charset — имя кодировки символов.Эта функция принимает одну из таких последовательностей пар и возвращает экземпляр
Header. Необязательные параметры maxlinelen, header_name и continuation_ws аналогичны параметрам конструктораHeader.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/email.header.html