imaplib.md
1> **Источник:** https://python-all.ru/3/library/imaplib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `imaplib` – клиент протокола IMAP489**Исходный код:** [Lib/imaplib.py](https://python-all.ru/src/3.14/Lib/imaplib.py)1011---1213Этот модуль определяет три класса: [`IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4), [`IMAP4_SSL`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4_SSL) и [`IMAP4_stream`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4_stream), которые инкапсулируют соединение с сервером IMAP4 и реализуют большую часть клиентского протокола IMAP4rev1, как определено в [**RFC 3501**](https://python-all.ru/3/library/imaplib.html). Он обратно совместим с серверами IMAP4 ([**RFC 1730**](https://python-all.ru/3/library/imaplib.html)), но учтите, что команда `STATUS` не поддерживается в IMAP4.1415[Доступность](https://python-all.ru/3/library/intro.html#availability): не WASI.1617Этот модуль не работает или недоступен на WebAssembly. Подробнее см. [платформы WebAssembly](https://python-all.ru/3/library/intro.html#wasm-availability).1819Модуль `imaplib` предоставляет три класса, [`IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4) – это базовый класс:2021#### `class imaplib.IMAP4(host='', port=IMAP4_PORT, timeout=None)`2223Этот класс реализует сам протокол IMAP4. Соединение создаётся и версия протокола (IMAP4 или IMAP4rev1) определяется при инициализации экземпляра. Если *host* не указан, используется `''` (локальный хост). Если *port* опущен, используется стандартный порт IMAP4 (143). Необязательный параметр *timeout* задаёт тайм-аут в секундах для попытки соединения. Если тайм-аут не задан или равен `None`, используется глобальный тайм-аут сокета по умолчанию.2425Класс `IMAP4` поддерживает оператор [`with`](https://python-all.ru/3/reference/compound_stmts.html#with). При таком использовании команда IMAP4 `LOGOUT` выполняется автоматически при выходе из оператора `with`. Например:2627```python28>>> from imaplib import IMAP429>>> with IMAP4("domain.org") as M:30... M.noop()31...32('OK', [b'Nothing Accomplished. d25if65hy903weo.87'])33```3435Изменено в версии 3.5: Поддержка оператора [`with`](https://python-all.ru/3/reference/compound_stmts.html#with) была добавлена.3637Изменено в версии 3.9: Добавлен необязательный параметр *timeout*.3839Три исключения определены как атрибуты класса [`IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4):4041#### `exception IMAP4.error`4243Исключение возникает при любых ошибках. Причина исключения передаётся конструктору в виде строки.4445#### `exception IMAP4.abort`4647Ошибки сервера IMAP4 вызывают это исключение. Оно является подклассом [`IMAP4.error`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.error). Обратите внимание, что закрытие экземпляра и создание нового обычно позволяет восстановиться после этого исключения.4849#### `exception IMAP4.readonly`5051Это исключение возникает, когда сервер изменяет статус почтового ящика, доступного для записи. Оно является подклассом [`IMAP4.error`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.error). Теперь другой клиент имеет права на запись, и для повторного получения прав на запись необходимо заново открыть почтовый ящик.5253Также существует подкласс для безопасных соединений:5455#### `class imaplib.IMAP4_SSL(host='', port=IMAP4_SSL_PORT, *, ssl_context=None, timeout=None)`5657Это подкласс, производный от [`IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4), который подключается через SSL-зашифрованный сокет (для использования этого класса необходим модуль сокета, скомпилированный с поддержкой SSL). Если *host* не указан, используется `''` (локальный хост). Если *port* опущен, используется стандартный порт IMAP4 через SSL (993). *ssl\_context* – это объект [`ssl.SSLContext`](https://python-all.ru/3/library/ssl.html#ssl.SSLContext), который позволяет объединить параметры конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долгоживущую) структуру. Пожалуйста, прочтите [Рекомендации по безопасности](https://python-all.ru/3/library/ssl.html#ssl-security) для получения рекомендаций.5859> **Примечание**60>61> При использовании *ssl\_context* по умолчанию соединение шифруется, но сертификат сервера и имя хоста не проверяются. Чтобы проверить их, передайте контекст, созданный с помощью [`ssl.create_default_context()`](https://python-all.ru/3/library/ssl.html#ssl.create_default_context).6263Необязательный параметр *timeout* задаёт тайм-аут в секундах для попытки соединения. Если тайм-аут не задан или равен `None`, используется глобальный тайм-аут сокета по умолчанию.6465Изменено в версии 3.3: Добавлен параметр *ssl\_context*.6667Изменено в версии 3.4: Теперь класс поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3/library/ssl.html#ssl.HAS_SNI)).6869Изменено в версии 3.9: Добавлен необязательный параметр *timeout*.7071Изменено в версии 3.12: Устаревшие параметры *keyfile* и *certfile* были удалены.7273Второй подкласс предназначен для соединений, создаваемых дочерним процессом:7475#### `class imaplib.IMAP4_stream(command)`7677Это подкласс, производный от [`IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4), который подключается к файловым дескрипторам `stdin/stdout`, создаваемым путём передачи *command* в `subprocess.Popen()`.7879Определены следующие вспомогательные функции:8081#### `imaplib.Internaldate2tuple(resp)`8283Разбирает [объект, подобный байтам](https://python-all.ru/3/glossary.html#term-bytes-like-object), содержащий ответ IMAP4 `INTERNALDATE`, и возвращает соответствующее местное время. Возвращаемое значение – кортеж [`time.struct_time`](https://python-all.ru/3/library/time.html#time.struct_time) или `None`, если входные данные имеют неверный формат.8485#### `imaplib.Int2AP(num)`8687Преобразует целое число в байтовое представление, используя символы из набора \[`A` .. `P`\].8889#### `imaplib.ParseFlags(resp)`9091Преобразует [байтоподобный объект](https://python-all.ru/3/glossary.html#term-bytes-like-object), содержащий ответ IMAP4 `FLAGS`, в кортеж отдельных флагов в виде [`bytes`](https://python-all.ru/3/library/stdtypes.html#bytes). Если входные данные имеют неверный формат, возвращается пустой кортеж.9293#### `imaplib.Time2Internaldate(date_time)`9495Преобразует *date\_time* в представление IMAP4 `INTERNALDATE`. Возвращается строка вида: `"DD-Mmm-YYYY HH:MM:SS +HHMM"` (включая двойные кавычки). Аргумент *date\_time* может быть числом (int или float), представляющим секунды с начала эпохи (как возвращается [`time.time()`](https://python-all.ru/3/library/time.html#time.time)), 9-кортежем, представляющим местное время, экземпляром [`time.struct_time`](https://python-all.ru/3/library/time.html#time.struct_time) (как возвращается [`time.localtime()`](https://python-all.ru/3/library/time.html#time.localtime)), осознанным экземпляром [`datetime.datetime`](https://python-all.ru/3/library/datetime.html#datetime.datetime) или строкой в двойных кавычках. В последнем случае считается, что она уже находится в правильном формате.9697Обратите внимание, что номера сообщений IMAP4 меняются при изменении почтового ящика; в частности, после выполнения команды `EXPUNGE`, которая удаляет сообщения, оставшиеся перенумеровываются. Поэтому настоятельно рекомендуется использовать UID с командой UID.9899В конце модуля есть тестовый раздел, содержащий более полный пример использования.100101> **См. также**102>103> Документы, описывающие протокол, исходные коды серверов, реализующих его, от Информационного центра IMAP Вашингтонского университета, можно найти по адресу (**Source Code**) [https://github.com/uw-imap/imap](https://python-all.ru/3/library/imaplib.html) (**Not Maintained**).104105## Объекты IMAP4106107Все команды IMAP4rev1 представлены методами с тем же именем, либо в верхнем, либо в нижнем регистре.108109Все аргументы команд преобразуются в строки, за исключением `AUTHENTICATE`, а последний аргумент `APPEND` передаётся как литерал IMAP4. При необходимости (если строка содержит символы, чувствительные к протоколу IMAP4, и не заключена в круглые или двойные кавычки) каждая строка заключается в кавычки. Однако аргумент *password* команды `LOGIN` всегда экранируется кавычками. Если вы хотите избежать экранирования строки аргумента (например, аргумент *flags* для `STORE`), то заключите строку в круглые скобки (например, `r'(\Deleted)'`). В общем случае передавайте аргументы без кавычек и позволяйте модулю экранировать их по мере необходимости. Аргумент, уже заключённый в двойные кавычки, остаётся без изменений, чтобы код, который сам экранирует аргументы, продолжал работать.110111Большинство команд возвращают кортеж: `(type, [data, ...])`, где *type* обычно равен `'OK'` или `'NO'`, а *data* – это либо текст ответа команды, либо обязательные результаты команды. Каждый *data* является либо `bytes`, либо кортежем. Если это кортеж, то первая часть – заголовок ответа, а вторая содержит данные (т.е. «литеральное» значение).112113Параметр *message\_set* в командах ниже – это строка, задающая одно или несколько сообщений, над которыми нужно выполнить действие. Это может быть простой номер сообщения (`'1'`), диапазон номеров сообщений (`'2:4'`) или группа несмежных диапазонов, разделённых запятыми (`'1:3,6:9'`). Диапазон может содержать звёздочку для обозначения бесконечной верхней границы (`'3:*'`).114115Экземпляр [`IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4) имеет следующие методы:116117#### `IMAP4.append(mailbox, flags, date_time, message)`118119Добавляет *message* в указанный почтовый ящик.120121*flags* может быть `None` или строкой токенов флагов IMAP. Несколько флагов разделяются пробелами, например `r'\Seen \Answered'`. Если *flags* ещё не заключён в круглые скобки, круглые скобки добавляются автоматически.122123#### `IMAP4.authenticate(mechanism, authobject)`124125Команда аутентификации – требуется обработка ответа.126127*mechanism* указывает, какой механизм аутентификации следует использовать – он должен присутствовать в переменной экземпляра `capabilities` в форме `AUTH=mechanism`.128129*authobject* должен быть вызываемым объектом:130131```python132data = authobject(response)133```134135Он будет вызываться для обработки ответов продолжения сервера; передаваемый ему аргумент *response* будет равен `bytes`. Он должен возвращать `bytes` *data*, которые будут закодированы в base64 и отправлены на сервер. Он должен возвращать `None`, если вместо этого следует отправить ответ прерывания клиента `*`.136137Изменено в версии 3.5: теперь строковые имена пользователей и пароли кодируются в `utf-8`, а не ограничиваются ASCII.138139#### `IMAP4.check()`140141Контрольная точка почтового ящика на сервере.142143#### `IMAP4.close()`144145Закрывает текущий выбранный почтовый ящик. Удалённые сообщения удаляются из почтового ящика с правом записи. Это рекомендуемая команда перед `LOGOUT`.146147#### `IMAP4.copy(message_set, new_mailbox)`148149Копирует сообщения *message\_set* в конец *new\_mailbox*.150151#### `IMAP4.create(mailbox)`152153Создаёт новый почтовый ящик с именем *mailbox*.154155#### `IMAP4.delete(mailbox)`156157Удаляет старый почтовый ящик с именем *mailbox*.158159#### `IMAP4.deleteacl(mailbox, who)`160161Удалить ACL (убрать все права), установленные для who на mailbox.162163#### `IMAP4.enable(capability)`164165Включить возможность (capability) *capability* (см. [**RFC 5161**](https://python-all.ru/3/library/imaplib.html)). Большинство возможностей не нужно включать. Сейчас поддерживается только возможность из `UTF8=ACCEPT` (см. [**RFC 6855**](https://python-all.ru/3/library/imaplib.html)).166167Добавлено в версии 3.5: Метод `enable()` и поддержка [**RFC 6855**](https://python-all.ru/3/library/imaplib.html).168169#### `IMAP4.expunge()`170171Окончательно удаляет помеченные на удаление письма из выбранного почтового ящика. Генерирует `EXPUNGE`-ответ для каждого удалённого сообщения. Возвращаемые данные содержат список `EXPUNGE` номеров сообщений в порядке их получения.172173#### `IMAP4.fetch(message_set, message_parts)`174175Извлекает (части) сообщений. *message\_parts* должна быть строкой с именами частей сообщения, заключёнными в круглые скобки, например: `"(UID BODY[TEXT])"`. Возвращаемые данные – это кортежи, содержащие конверт (envelope) и данные части сообщения.176177#### `IMAP4.getacl(mailbox)`178179Получает `ACL` для *mailbox*. Метод нестандартный, но поддерживается сервером `Cyrus`.180181#### `IMAP4.getannotation(mailbox, entry, attribute)`182183Извлекает указанные `ANNOTATION` для *mailbox*. Метод нестандартный, но поддерживается сервером `Cyrus`.184185#### `IMAP4.getquota(root)`186187Получает использование ресурсов и лимиты для `quota` *root*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.188189#### `IMAP4.getquotaroot(mailbox)`190191Получает список `quota` `roots` для указанного *mailbox*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.192193#### `IMAP4.idle(duration=None)`194195Return an `Idler`: an iterable context manager implementing the IMAP4 `IDLE` command as defined in [**RFC 2177**](https://python-all.ru/3/library/imaplib.html).196197Возвращаемый объект отправляет команду `IDLE` при активации в операторе [`with`](https://python-all.ru/3/reference/compound_stmts.html#with), выдаёт непомеченные (untagged) ответы IMAP через протокол [итератора](https://python-all.ru/3/glossary.html#term-iterator) и отправляет `DONE` при выходе из контекста.198199Все непомеченные ответы, полученные после отправки команды `IDLE` (включая те, что приходят до подтверждения команды сервером), будут доступны через итерацию. Оставшиеся ответы (не проитерированные в контексте [`with`](https://python-all.ru/3/reference/compound_stmts.html#with)) можно получить обычным способом после завершения `IDLE`, используя [`IMAP4.response()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.response).200201Ответы представляются в виде кортежа `(type, [data, ...])`, как описано в разделе [Объекты IMAP4](https://python-all.ru/3/library/imaplib.html#imap4-objects).202203Аргумент *duration* задаёт максимальную длительность (в секундах) ожидания бездействия, после которой любая текущая итерация будет остановлена. Он может быть [`int`](https://python-all.ru/3/library/functions.html#int) или [`float`](https://python-all.ru/3/library/functions.html#float), или `None` для отсутствия ограничения по времени. Чтобы избежать тайм-аута бездействия на серверах, где он есть, следует устанавливать не более 29 минут (1740 секунд). Требует сокетного соединения; *duration* должно быть `None` на соединениях [`IMAP4_stream`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4_stream).204205```pycon206>>> with M.idle(duration=29 * 60) as idler:207... for typ, data in idler:208... print(typ, data)209...210EXISTS [b'1']211RECENT [b'1']212```213214#### `Idler.burst(interval=0.1)`215216Выдаёт пакет ответов с интервалом не более *interval* секунд (выражается как [`int`](https://python-all.ru/3/library/functions.html#int) или [`float`](https://python-all.ru/3/library/functions.html#float)).217218Этот [генератор](https://python-all.ru/3/glossary.html#term-generator) является альтернативой поочерёдной итерации ответов и предназначен для эффективной пакетной обработки. Он извлекает следующий ответ вместе с любыми сразу доступными последующими ответами. (Например, быстрая серия ответов `EXPUNGE` после массового удаления.)219220Требуется сокетное соединение; не работает на соединениях [`IMAP4_stream`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4_stream).221222```pycon223>>> with M.idle() as idler:224... # получить ответ и любые другие, следующие с интервалом менее 0.1 секунды225... batch = list(idler.burst())226... print(f'processing {len(batch)} responses...')227... print(batch)228...229processing 3 responses...230[('EXPUNGE', [b'2']), ('EXPUNGE', [b'1']), ('RECENT', [b'0'])]231```232233> **Совет**234>235> Максимальная длительность контекста `IDLE`, переданная в `IMAP4.idle()`, соблюдается при ожидании первого ответа в пакете. Поэтому истекший `Idler` приведёт к тому, что этот генератор завершится немедленно, ничего не выдавая. Разработчикам следует учитывать это при использовании в цикле.236237> **Примечание**238>239> Итератор, возвращаемый `IMAP4.idle()`, можно использовать только внутри оператора [`with`](https://python-all.ru/3/reference/compound_stmts.html#with). До или после этого контекста незапрошенные ответы собираются внутренне по завершении любой команды и могут быть получены с помощью [`IMAP4.response()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.response).240241> **Примечание**242>243> Имя и структура класса `Idler` являются внутренними интерфейсами и могут измениться. Вызывающий код может рассчитывать на стабильность его управления контекстом, итерации и публичного метода, но не должен создавать подклассы, экземпляры, сравнивать или иным образом напрямую ссылаться на класс.244245Добавлено в версии 3.14.246247#### `IMAP4.list(directory='', pattern='*')`248249Перечисляет имена почтовых ящиков в *directory*, соответствующие *pattern*. *directory* по умолчанию является корневой папкой почты, а *pattern* по умолчанию соответствует всему. Возвращаемые данные содержат список ответов `LIST`.250251#### `IMAP4.login(user, password)`252253Идентифицирует клиента с помощью пароля в открытом виде. Параметр *password* будет заключён в кавычки.254255#### `IMAP4.login_cram_md5(user, password)`256257Принудительно использует аутентификацию `CRAM-MD5` для защиты пароля при идентификации клиента. Сработает, только если ответ сервера `CAPABILITY` содержит фразу `AUTH=CRAM-MD5`.258259Изменено в версии 3.14: Если поддержка MD5 недоступна, возбуждается исключение [`IMAP4.error`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.error).260261#### `IMAP4.logout()`262263Закрывает соединение с сервером. Возвращает ответ сервера `BYE`.264265Изменено в версии 3.8: Метод больше не игнорирует любые исключения без уведомления.266267#### `IMAP4.lsub(directory='', pattern='*')`268269Выводит список подписанных почтовых ящиков в указанном каталоге, соответствующих шаблону. По умолчанию *directory* – корневой каталог, а *pattern* – любой почтовый ящик. Возвращаемые данные – кортежи из конверта части сообщения и данных.270271#### `IMAP4.myrights(mailbox)`272273Показывает списки управления доступом (ACL) почтового ящика (т.е. права, которые у клиента есть на этот ящик).274275#### `IMAP4.namespace()`276277Возвращает пространства имён IMAP, определённые в [**RFC 2342**](https://python-all.ru/3/library/imaplib.html).278279#### `IMAP4.noop()`280281Отправляет `NOOP` на сервер.282283#### `IMAP4.open(host, port, timeout=None)`284285Открывает сокет на порту *port* на хосте *host*. Необязательный параметр *timeout* задаёт тайм-аут подключения в секундах. Если тайм-аут не указан или равен `None`, используется глобальный тайм-аут сокета по умолчанию. Также обратите внимание: если параметр *timeout* равен нулю, будет возбуждено исключение [`ValueError`](https://python-all.ru/3/library/exceptions.html#ValueError), чтобы запретить создание неблокирующего сокета. Этот метод неявно вызывается конструктором [`IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4). Объекты соединения, установленные этим методом, будут использоваться в методах [`IMAP4.read()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.read), [`IMAP4.readline()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.readline), [`IMAP4.send()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.send) и [`IMAP4.shutdown()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.shutdown). Этот метод можно переопределить.286287Вызывает [событие аудита](https://python-all.ru/3/library/sys.html#auditing) `imaplib.open` с аргументами `self`, `host`, `port`.288289Изменено в версии 3.9: Добавлен параметр *timeout*.290291#### `IMAP4.partial(message_num, message_part, start, length)`292293Извлекает усечённую часть сообщения. Возвращаемые данные – кортеж из конверта части сообщения и данных.294295#### `IMAP4.proxyauth(user)`296297Предполагает аутентификацию от имени пользователя *user*. Позволяет авторизованному администратору выполнять прокси-доступ к почтовому ящику любого пользователя.298299#### `IMAP4.read(size)`300301Читает *size* байт с удалённого сервера. Этот метод можно переопределить.302303#### `IMAP4.readline()`304305Читает одну строку с удалённого сервера. Этот метод можно переопределить.306307#### `IMAP4.recent()`308309Запрашивает у сервера обновление. Возвращаемые данные – `None`, если нет новых сообщений, иначе значение ответа `RECENT`.310311#### `IMAP4.rename(oldmailbox, newmailbox)`312313Переименовывает почтовый ящик с именем *oldmailbox* в *newmailbox*.314315#### `IMAP4.response(code)`316317Возвращает данные для *кода* ответа, если он получен, или `None`. Возвращает указанный код вместо обычного типа.318319#### `IMAP4.search(charset, criterion[, ...])`320321Ищет в почтовом ящике сообщения, соответствующие условиям. *charset* может быть `None`, и в этом случае `CHARSET` не будет указан в запросе к серверу. Протокол IMAP требует указать хотя бы один критерий; при ошибке со стороны сервера будет возбуждено исключение. *charset* должен быть `None`, если возможность `UTF8=ACCEPT` была включена с помощью команды [`enable()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.enable).322323Пример:324325```python326# M – это подключенный экземпляр IMAP4...327typ, msgnums = M.search(None, 'FROM', '"LDJ"')328329# или:330typ, msgnums = M.search(None, '(FROM "LDJ")')331```332333#### `IMAP4.select(mailbox='INBOX', readonly=False)`334335Выбирает почтовый ящик. Возвращаемые данные – количество сообщений в *mailbox* (ответ `EXISTS`). По умолчанию *mailbox* равен `'INBOX'`. Если установлен флаг *readonly*, изменения в почтовом ящике запрещены.336337#### `IMAP4.send(data)`338339Отправляет `data` на удалённый сервер. Этот метод можно переопределить.340341Возбуждает [событие аудита](https://python-all.ru/3/library/sys.html#auditing) `imaplib.send` с аргументами `self`, `data`.342343#### `IMAP4.setacl(mailbox, who, what)`344345Устанавливает `ACL` для *mailbox*. Метод является нестандартным, но поддерживается сервером `Cyrus`.346347#### `IMAP4.setannotation(mailbox, entry, attribute[, ...])`348349Устанавливает `ANNOTATION` для *mailbox*. Метод является нестандартным, но поддерживается сервером `Cyrus`.350351#### `IMAP4.setquota(root, limits)`352353Устанавливает `quota` ресурса *root* – *limits*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.354355#### `IMAP4.shutdown()`356357Закрывает соединение, установленное в `open`. Этот метод неявно вызывается методом [`IMAP4.logout()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.logout). Этот метод можно переопределить.358359#### `IMAP4.socket()`360361Возвращает экземпляр сокета, используемый для подключения к серверу.362363#### `IMAP4.sort(sort_criteria, charset, search_criterion[, ...])`364365Команда `sort` является вариантом `search` с семантикой сортировки результатов. Возвращаемые данные содержат список номеров подходящих сообщений, разделённых пробелами.366367Sort имеет два аргумента перед аргументом(ами) *search\_criterion*: список *sort\_criteria* в скобках и поисковый *charset*. Обратите внимание: в отличие от `search`, аргумент *charset* является обязательным. Также существует команда `uid sort`, которая соответствует `sort` так же, как `uid search` соответствует `search`. Команда `sort` сначала ищет в почтовом ящике сообщения, соответствующие заданным критериям поиска, используя аргумент charset для интерпретации строк в критериях поиска. Затем она возвращает номера подходящих сообщений.368369Это команда расширения `IMAP4rev1`.370371#### `IMAP4.starttls(ssl_context=None)`372373Отправляет команду `STARTTLS`. Аргумент *ssl\_context* является необязательным и должен быть объектом [`ssl.SSLContext`](https://python-all.ru/3/library/ssl.html#ssl.SSLContext). Это включит шифрование в IMAP-соединении. Пожалуйста, прочитайте [рекомендации по безопасности](https://python-all.ru/3/library/ssl.html#ssl-security) для соблюдения лучших практик.374375> **Примечание**376>377> При использовании *ssl\_context* по умолчанию соединение шифруется, но сертификат сервера и имя хоста не проверяются. Для их проверки передайте контекст, созданный с помощью [`ssl.create_default_context()`](https://python-all.ru/3/library/ssl.html#ssl.create_default_context).378379Добавлено в версии 3.2.380381Изменено в версии 3.4: Теперь метод поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3/library/ssl.html#ssl.HAS_SNI)).382383#### `IMAP4.status(mailbox, names)`384385Запрашивает именованные условия состояния для *mailbox*.386387#### `IMAP4.store(message_set, command, flag_list)`388389Изменяет назначения флагов для сообщений в почтовом ящике. *command* определяется в разделе 6.4.6 документа [**RFC 3501**](https://python-all.ru/3/library/imaplib.html) как один из вариантов: “FLAGS”, “+FLAGS” или “-FLAGS”, необязательно с суффиксом “.SILENT”.390391Например, чтобы установить флаг удаления на все сообщения:392393```python394typ, data = M.search(None, 'ALL')395for num in data[0].split():396 M.store(num, '+FLAGS', '\\Deleted')397M.expunge()398```399400> **Примечание**401>402> Создание флагов, содержащих ‘\]’ (например, “\[test\]”), нарушает [**RFC 3501**](https://python-all.ru/3/library/imaplib.html) (протокол IMAP). Однако imaplib исторически допускал создание таких флагов, и популярные IMAP-серверы, такие как Gmail, принимают и создают такие флаги. Существуют также программы не на Python, которые создают такие флаги. Хотя это нарушение RFC и IMAP-клиенты и серверы должны быть строгими, imaplib по-прежнему продолжает разрешать создание таких флагов по причинам обратной совместимости, и начиная с Python 3.6 обрабатывает их, если они отправлены с сервера, так как это улучшает совместимость в реальном мире.403404#### `IMAP4.subscribe(mailbox)`405406Подписаться на новый почтовый ящик.407408#### `IMAP4.thread(threading_algorithm, charset, search_criterion[, ...])`409410Команда `thread` является вариантом `search` с семантикой threading для результатов. Возвращаемые данные содержат разделенный пробелами список участников ветвей.411412Участники ветвей состоят из нуля или более номеров сообщений, разделенных пробелами, указывающих последовательные родительские и дочерние элементы.413414Поток имеет два аргумента перед аргументом(ами) *search\_criterion*: *threading\_algorithm* и *charset* для поиска. Обратите внимание, что в отличие от `search`, аргумент *charset* является обязательным. Также существует команда `uid thread`, которая соответствует `thread` так же, как `uid search` соответствует `search`. Команда `thread` сначала ищет в почтовом ящике сообщения, соответствующие заданным критериям поиска, используя аргумент *charset* для интерпретации строк в критериях поиска. Затем она возвращает подходящие сообщения, сгруппированные в потоки в соответствии с указанным алгоритмом потоковой группировки.415416Это команда расширения `IMAP4rev1`.417418#### `IMAP4.uid(command, arg[, ...])`419420Выполняет команду с аргументами для сообщений, идентифицированных по UID, а не по номеру сообщения. Возвращает ответ, соответствующий команде. Должен быть указан по крайней мере один аргумент; если ни одного не передано, сервер вернет ошибку, и будет возбуждено исключение.421422#### `IMAP4.unsubscribe(mailbox)`423424Отписаться от старого почтового ящика.425426#### `IMAP4.unselect()`427428`imaplib.IMAP4.unselect()` освобождает ресурсы сервера, связанные с выбранным почтовым ящиком, и возвращает сервер в аутентифицированное состояние. Эта команда выполняет те же действия, что и [`imaplib.IMAP4.close()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.close), за исключением того, что сообщения не удаляются безвозвратно из текущего выбранного почтового ящика.429430Добавлено в версии 3.9.431432#### `IMAP4.xatom(name[, ...])`433434Позволяет простые расширенные команды, уведомляемые сервером в ответе `CAPABILITY`.435436На экземплярах [`IMAP4`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4) определены следующие атрибуты:437438#### `IMAP4.PROTOCOL_VERSION`439440Последний поддерживаемый протокол в ответе `CAPABILITY` от сервера.441442#### `IMAP4.debug`443444Целочисленное значение для управления выводом отладочной информации. Начальное значение берется из переменной модуля `Debug`. Значения больше трех трассируют каждую команду.445446#### `IMAP4.utf8_enabled`447448Логическое значение, которое обычно равно `False`, но устанавливается в `True`, если команда [`enable()`](https://python-all.ru/3/library/imaplib.html#imaplib.IMAP4.enable) была успешно выдана для возможности `UTF8=ACCEPT`.449450Добавлено в версии 3.5.451452## Пример IMAP4453454Вот минимальный пример (без проверки ошибок), который открывает почтовый ящик и извлекает и выводит все сообщения:455456```python457import getpass, imaplib458459M = imaplib.IMAP4(host='example.org')460M.login(getpass.getuser(), getpass.getpass())461M.select()462typ, data = M.search(None, 'ALL')463for num in data[0].split():464 typ, data = M.fetch(num, '(RFC822)')465 print('Message %s\n%s\n' % (num, data[0][1]))466M.close()467M.logout()468```469470> **Примечание**471>472> Ответ `FETCH` может содержать дополнительные или незапрашиваемые данные (см. [**RFC 3501**](https://python-all.ru/3/library/imaplib.html), раздел 7.4.2), поэтому рабочий код должен проверять весь ответ, а не полагаться на `data[0][1]`.473