> **Источник:** https://python-all.ru/3.1/library/email.header.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 18.1.5. [`email`](https://python-all.ru/3.1/library/email.html#module-email): Интернационализированные заголовки

[**RFC 2822**](https://python-all.ru/3.1/library/email.header.html) – это базовый стандарт, описывающий формат email-сообщений. Он происходит от более старого стандарта [**RFC 822**](https://python-all.ru/3.1/library/email.header.html), который получил широкое распространение в то время, когда большинство писем состояло только из символов ASCII. [**RFC 2822**](https://python-all.ru/3.1/library/email.header.html) – это спецификация, написанная в предположении, что email содержит только 7-битные символы ASCII.

Of course, as email has been deployed worldwide, it has become internationalized, such that language specific character sets can now be used in email messages. The base standard still requires email messages to be transferred using only 7-bit ASCII characters, so a slew of RFCs have been written describing how to encode email containing non-ASCII characters into [**RFC 2822**](https://python-all.ru/3.1/library/email.header.html)-compliant format. These RFCs include [**RFC 2045**](https://python-all.ru/3.1/library/email.header.html), [**RFC 2046**](https://python-all.ru/3.1/library/email.header.html), [**RFC 2047**](https://python-all.ru/3.1/library/email.header.html), and [**RFC 2231**](https://python-all.ru/3.1/library/email.header.html). The [`email`](https://python-all.ru/3.1/library/email.html#module-email) package supports these standards in its `email.header` and [`email.charset`](https://python-all.ru/3.1/library/email.charset.html#module-email.charset) modules.

Если требуется включить не-ASCII символы в заголовки email, например, в поля *Subject* или *To*, следует использовать класс [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header) и присвоить полю в объекте [`Message`](https://python-all.ru/3.1/library/email.message.html#email.message.Message) экземпляр [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header) вместо того, чтобы использовать строку в качестве значения заголовка. Импортируйте класс [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header) из модуля `email.header`. Например:

```python
>>> from email.message import Message
>>> from email.header import Header
>>> msg = Message()
>>> h = Header('p\xf6stal', 'iso-8859-1')
>>> msg['Subject'] = h
>>> print(msg.as_string())
Subject: =?iso-8859-1?q?p=F6stal?=
```

Обратите внимание: мы хотели, чтобы поле *Subject* содержало не-ASCII символ? Для этого мы создали экземпляр [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header) и передали кодировку, в которой закодирована байтовая строка. Когда последующий экземпляр [`Message`](https://python-all.ru/3.1/library/email.message.html#email.message.Message) был преобразован в линейную форму, поле *Subject* было правильно закодировано по [**RFC 2047**](https://python-all.ru/3.1/library/email.header.html). Почтовые клиенты, поддерживающие MIME, отобразят этот заголовок с использованием встроенного символа ISO-8859-1.

Вот описание класса [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header):

#### `class email.header.Header(s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict')`

Создаёт заголовок, совместимый с MIME, который может содержать строки в разных наборах символов.

Необязательный параметр *s* – это начальное значение заголовка. Если `None` (значение по умолчанию), начальное значение не задаётся. Позднее можно добавлять данные в заголовок вызовами метода [`append()`](https://python-all.ru/3.1/library/email.header.html#email.header.Header.append). *s* может быть экземпляром [`bytes`](https://python-all.ru/3.1/library/functions.html#bytes) или [`str`](https://python-all.ru/3.1/library/functions.html#str), но за разъяснением семантики обратитесь к документации [`append()`](https://python-all.ru/3.1/library/email.header.html#email.header.Header.append).

Optional *charset* serves two purposes: it has the same meaning as the *charset* argument to the [`append()`](https://python-all.ru/3.1/library/email.header.html#email.header.Header.append) method. It also sets the default character set for all subsequent [`append()`](https://python-all.ru/3.1/library/email.header.html#email.header.Header.append) calls that omit the *charset* argument. If *charset* is not provided in the constructor (the default), the `us-ascii` character set is used both as *s*‘s initial charset and as the default for subsequent [`append()`](https://python-all.ru/3.1/library/email.header.html#email.header.Header.append) calls.

Максимальную длину строки можно задать явно через *maxlinelen*. Чтобы разделить первую строку на более короткое значение (с учётом заголовка поля, который не входит в *s*, например *Subject*), передайте имя поля в параметре *header\_name*. Значение по умолчанию для *maxlinelen* – 76, а значение по умолчанию для *header\_name* – `None`, то есть оно не учитывается для первой строки длинного разделённого заголовка.

Необязательный параметр *continuation\_ws* должен быть пробельным символом для переноса, совместимым с [**RFC 2822**](https://python-all.ru/3.1/library/email.header.html), и обычно это пробел или символ табуляции. Этот символ будет добавляться в начало строк продолжения. По умолчанию *continuation\_ws* – это одиночный пробел.

Необязательный параметр *errors* передаётся напрямую методу [`append()`](https://python-all.ru/3.1/library/email.header.html#email.header.Header.append).

#### `append(s, charset=None, errors='strict')`

Добавляет строку *s* к MIME-заголовку.

Необязательный параметр *charset*, если указан, должен быть экземпляром [`Charset`](https://python-all.ru/3.1/library/email.charset.html#email.charset.Charset) (см. [`email.charset`](https://python-all.ru/3.1/library/email.charset.html#module-email.charset)) или именем кодировки, которая будет преобразована в экземпляр [`Charset`](https://python-all.ru/3.1/library/email.charset.html#email.charset.Charset). Значение `None` (по умолчанию) означает, что используется *charset*, заданный в конструкторе.

*s* может быть экземпляром [`bytes`](https://python-all.ru/3.1/library/functions.html#bytes) или [`str`](https://python-all.ru/3.1/library/functions.html#str). Если это экземпляр [`bytes`](https://python-all.ru/3.1/library/functions.html#bytes), то *charset* – это кодировка этой байтовой строки, и будет вызвано исключение [`UnicodeError`](https://python-all.ru/3.1/library/exceptions.html#UnicodeError), если строку невозможно декодировать с помощью этой кодировки.

Если *s* – экземпляр [`str`](https://python-all.ru/3.1/library/functions.html#str), то *charset* – это подсказка, указывающая кодировку символов в строке.

В любом случае, при создании заголовка, совместимого с [**RFC 2822**](https://python-all.ru/3.1/library/email.header.html), с использованием правил [**RFC 2047**](https://python-all.ru/3.1/library/email.header.html), строка будет закодирована с помощью выходного кодека набора символов. Если строка не может быть закодирована с помощью выходного кодека, будет возбуждено исключение UnicodeError.

Необязательный *errors* передаётся как аргумент errors при вызове decode, если *s* является байтовой строкой.

#### `encode(splitchars=';, \t', maxlinelen=None)`

Кодирует заголовок сообщения в формат, совместимый с RFC, возможно, с переносом длинных строк и заключением не-ASCII частей в кодировки base64 или quoted-printable. Необязательный параметр *splitchars* – это строка, содержащая символы, по которым можно разбивать длинные ASCII-строки, в грубом соответствии с [**RFC 2822**](https://python-all.ru/3.1/library/email.header.html)‘s *синтаксическими разрывами наивысшего уровня*. Это не влияет на строки, закодированные согласно [**RFC 2047**](https://python-all.ru/3.1/library/email.header.html).

*maxlinelen*, если указан, переопределяет значение экземпляра для максимальной длины строки.

Класс [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header) также предоставляет ряд методов для поддержки стандартных операторов и встроенных функций.

#### `__str__()`

Вспомогательная функция для метода

[`str`](https://python-all.ru/3.1/library/functions.html#str)

‘s

[`encode()`](https://python-all.ru/3.1/library/email.header.html#email.header.Header.encode)

. Возвращает заголовок в виде строки Unicode.

#### `__eq__(other)`

Этот метод позволяет сравнивать два экземпляра

[`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header)

на равенство.

#### `__ne__(other)`

Этот метод позволяет сравнивать два экземпляра

[`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header)

на неравенство.

Модуль `email.header` также предоставляет следующие удобные функции.

#### `email.header.decode_header(header)`

Декодирует значение заголовка сообщения без преобразования набора символов. Значение заголовка находится в *header*.

Эта функция возвращает список пар `(decoded_string, charset)`, содержащих каждую из декодированных частей заголовка. *charset* равен `None` для незакодированных частей заголовка, в противном случае это строка в нижнем регистре, содержащая имя кодировки, указанной в закодированной строке.

Вот пример:

```python
>>> from email.header import decode_header
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
[('p\xf6stal', 'iso-8859-1')]
```

#### `email.header.make_header(decoded_seq, maxlinelen=None, header_name=None, continuation_ws=' ')`

Создаёт экземпляр [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header) из последовательности пар, возвращённой функцией [`decode_header()`](https://python-all.ru/3.1/library/email.header.html#email.header.decode_header).

Функция [`decode_header()`](https://python-all.ru/3.1/library/email.header.html#email.header.decode_header) принимает строку значения заголовка и возвращает последовательность пар формата `(decoded_string, charset)`, где *charset* – имя кодировки.

Эта функция принимает одну из таких последовательностей пар и возвращает экземпляр [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header). Необязательные параметры *maxlinelen*, *header\_name* и *continuation\_ws* такие же, как в конструкторе [`Header`](https://python-all.ru/3.1/library/email.header.html#email.header.Header).
