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

---

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

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

Конечно, с распространением email по всему миру он стал интернационализированным, так что теперь в email-сообщениях можно использовать наборы символов, специфичные для языка. Базовый стандарт по-прежнему требует, чтобы email-сообщения передавались только с использованием 7-битных символов ASCII, поэтому был написан ряд RFC, описывающих, как кодировать email, содержащий не-ASCII символы, в формат, совместимый с [**RFC 2822**](https://python-all.ru/2.7/library/email.header.html). Эти RFC включают [**RFC 2045**](https://python-all.ru/2.7/library/email.header.html), [**RFC 2046**](https://python-all.ru/2.7/library/email.header.html), [**RFC 2047**](https://python-all.ru/2.7/library/email.header.html) и [**RFC 2231**](https://python-all.ru/2.7/library/email.header.html). Пакет [`email`](https://python-all.ru/2.7/library/email.html#module-email) поддерживает эти стандарты в своих модулях [`email.header`](https://python-all.ru/2.7/library/email.header.html#module-email.header) и [`email.charset`](https://python-all.ru/2.7/library/email.charset.html#module-email.charset).

Если вы хотите включить не-ASCII символы в заголовки email, например, в поля *Subject* или *To*, следует использовать класс [`Header`](https://python-all.ru/2.7/library/email.header.html#email.header.Header) и присвоить поле в объекте [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) экземпляру [`Header`](https://python-all.ru/2.7/library/email.header.html#email.header.Header) вместо использования строки для значения заголовка. Импортируйте класс [`Header`](https://python-all.ru/2.7/library/email.header.html#email.header.Header) из модуля [`email.header`](https://python-all.ru/2.7/library/email.header.html#module-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/2.7/library/email.header.html#email.header.Header) и передав набор символов, в котором была закодирована байтовая строка. Когда последующий экземпляр [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) был преобразован в плоскую строку, поле *Subject* было должным образом закодировано с помощью [**RFC 2047**](https://python-all.ru/2.7/library/email.header.html). Почтовые программы, поддерживающие MIME, покажут этот заголовок, используя встроенный символ ISO-8859-1.

Новое в версии 2.2.2.

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

#### `class email.header.Header([s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])`

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

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

Необязательный параметр *charset* служит двум целям: он имеет то же значение, что и аргумент *charset* метода [`append()`](https://python-all.ru/2.7/library/email.header.html#email.header.Header.append). Он также устанавливает набор символов по умолчанию для всех последующих вызовов [`append()`](https://python-all.ru/2.7/library/email.header.html#email.header.Header.append), в которых опущен аргумент *charset*. Если *charset* не указан в конструкторе (по умолчанию), набор символов `us-ascii` используется как начальный набор символов для *s*, так и как набор по умолчанию для последующих вызовов [`append()`](https://python-all.ru/2.7/library/email.header.html#email.header.Header.append).

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

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

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

#### `append(s[, charset[, errors]])`

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

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

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

If *s* is a Unicode string, then *charset* is a hint specifying the character set of the characters in the string. In this case, when producing an [**RFC 2822**](https://python-all.ru/2.7/library/email.header.html)-compliant header using [**RFC 2047**](https://python-all.ru/2.7/library/email.header.html) rules, the Unicode string will be encoded using the following charsets in order: `us-ascii`, the *charset* hint, `utf-8`. The first character set to not provoke a [`UnicodeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.UnicodeError) is used.

Необязательный параметр *errors* передаётся любому вызову [`unicode()`](https://python-all.ru/2.7/library/functions.html#unicode) или `unicode.encode()` и по умолчанию равен “strict”.

#### `encode([splitchars])`

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

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

#### `__str__()`

Синоним для [`Header.encode()`](https://python-all.ru/2.7/library/email.header.html#email.header.Header.encode). Полезно для `str(aHeader)`.

#### `__unicode__()`

Вспомогательная функция для встроенной функции [`unicode()`](https://python-all.ru/2.7/library/functions.html#unicode). Возвращает заголовок в виде строки Unicode.

#### `__eq__(other)`

Этот метод позволяет сравнивать два экземпляра [`Header`](https://python-all.ru/2.7/library/email.header.html#email.header.Header) на равенство.

#### `__ne__(other)`

Этот метод позволяет сравнивать два экземпляра [`Header`](https://python-all.ru/2.7/library/email.header.html#email.header.Header) на неравенство.

Модуль [`email.header`](https://python-all.ru/2.7/library/email.header.html#module-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[, header_name[, continuation_ws]]])`

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

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

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