imaplib.md
1> **Источник:** https://python-all.ru/3.11/library/imaplib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`imaplib`](https://python-all.ru/3.11/library/imaplib.html#module-imaplib) – клиент протокола IMAP489**Исходный код:** [Lib/imaplib.py](https://python-all.ru/src/3.11/Lib/imaplib.py)1011---1213Этот модуль определяет три класса, [`IMAP4`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4), [`IMAP4_SSL`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4_SSL) и [`IMAP4_stream`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4_stream), которые инкапсулируют соединение с IMAP4-сервером и реализуют большую часть клиентского протокола IMAP4rev1, описанного в [**RFC 2060**](https://python-all.ru/3.11/library/imaplib.html). Он обратно совместим с IMAP4-серверами ([**RFC 1730**](https://python-all.ru/3.11/library/imaplib.html)), но следует учесть, что команда `STATUS` не поддерживается в IMAP4.1415[Доступность](https://python-all.ru/3.11/library/intro.html#availability): not Emscripten, not WASI.1617Этот модуль не работает или недоступен на платформах WebAssembly `wasm32-emscripten` и `wasm32-wasi`. См. [платформы WebAssembly](https://python-all.ru/3.11/library/intro.html#wasm-availability) для получения дополнительной информации.1819Модуль [`imaplib`](https://python-all.ru/3.11/library/imaplib.html#module-imaplib) предоставляет три класса, [`IMAP4`](https://python-all.ru/3.11/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`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4) поддерживает оператор [`with`](https://python-all.ru/3.11/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.11/reference/compound_stmts.html#with) была добавлена.3637Изменено в версии 3.9: Добавлен необязательный параметр *timeout*.3839Три исключения определены как атрибуты класса [`IMAP4`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4):4041#### `exception IMAP4.error`4243Исключение возникает при любых ошибках. Причина исключения передаётся конструктору в виде строки.4445#### `exception IMAP4.abort`4647Ошибки сервера IMAP4 вызывают это исключение. Оно является подклассом [`IMAP4.error`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.error). Обратите внимание, что закрытие экземпляра и создание нового обычно позволяет восстановиться после этого исключения.4849#### `exception IMAP4.readonly`5051Это исключение возникает, когда сервер изменяет статус почтового ящика, доступного для записи. Оно является подклассом [`IMAP4.error`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.error). Теперь другой клиент имеет права на запись, и для повторного получения прав на запись необходимо заново открыть почтовый ящик.5253Также существует подкласс для безопасных соединений:5455#### `class imaplib.IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=None, timeout=None)`5657Это подкласс, производный от [`IMAP4`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4), который подключается через SSL-зашифрованный сокет (для использования этого класса необходим модуль сокета, скомпилированный с поддержкой SSL). Если *host* не указан, используется `''` (локальный хост). Если *port* опущен, используется стандартный порт IMAP4 через SSL (993). *ssl\_context* – это объект [`ssl.SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext), который позволяет объединить параметры конфигурации SSL, сертификаты и закрытые ключи в единую (потенциально долгоживущую) структуру. Пожалуйста, прочтите [Рекомендации по безопасности](https://python-all.ru/3.11/library/ssl.html#ssl-security) для получения рекомендаций.5859*keyfile* и *certfile* являются устаревшей альтернативой *ssl\_context* – они могут указывать на файлы закрытого ключа и цепочки сертификатов в формате PEM для SSL-соединения. Обратите внимание, что параметры *keyfile*/*certfile* взаимно исключают *ssl\_context*, и [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError) возникает, если *keyfile*/*certfile* указаны вместе с *ssl\_context*.6061Необязательный параметр *timeout* задаёт тайм-аут в секундах для попытки подключения. Если тайм-аут не задан или равен None, используется глобальный тайм-аут сокета по умолчанию.6263Изменено в версии 3.3: Добавлен параметр *ssl\_context*.6465Изменено в версии 3.4: Теперь класс поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3.11/library/ssl.html#ssl.HAS_SNI)).6667Устарело с версии 3.6: *keyfile* и *certfile* устарели в пользу *ssl\_context*. Вместо этого используйте [`ssl.SSLContext.load_cert_chain()`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.load_cert_chain) или позвольте [`ssl.create_default_context()`](https://python-all.ru/3.11/library/ssl.html#ssl.create_default_context) выбрать доверенные сертификаты CA системы для вас.6869Изменено в версии 3.9: Добавлен необязательный параметр *timeout*.7071Второй подкласс предназначен для соединений, создаваемых дочерним процессом:7273#### `class imaplib.IMAP4_stream(command)`7475Это подкласс, производный от [`IMAP4`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4), который подключается к файловым дескрипторам `stdin/stdout`, создаваемым путём передачи *command* в `subprocess.Popen()`.7677Определены следующие вспомогательные функции:7879#### `imaplib.Internaldate2tuple(datestr)`8081Разбирает строку `INTERNALDATE` IMAP4 и возвращает соответствующее локальное время. Возвращаемое значение – кортеж [`time.struct_time`](https://python-all.ru/3.11/library/time.html#time.struct_time) или `None`, если строка имеет неверный формат.8283#### `imaplib.Int2AP(num)`8485Преобразует целое число в байтовое представление, используя символы из набора \[`A` .. `P`\].8687#### `imaplib.ParseFlags(flagstr)`8889Преобразует ответ IMAP4 `FLAGS` в кортеж отдельных флагов.9091#### `imaplib.Time2Internaldate(date_time)`9293Преобразует *date\_time* в представление IMAP4 `INTERNALDATE`. Возвращается строка вида: `"DD-Mmm-YYYY HH:MM:SS +HHMM"` (включая двойные кавычки). Аргумент *date\_time* может быть числом (int или float), представляющим секунды с начала эпохи (как возвращается [`time.time()`](https://python-all.ru/3.11/library/time.html#time.time)), 9-кортежем, представляющим местное время, экземпляром [`time.struct_time`](https://python-all.ru/3.11/library/time.html#time.struct_time) (как возвращается [`time.localtime()`](https://python-all.ru/3.11/library/time.html#time.localtime)), осознанным экземпляром [`datetime.datetime`](https://python-all.ru/3.11/library/datetime.html#datetime.datetime) или строкой в двойных кавычках. В последнем случае считается, что она уже находится в правильном формате.9495Обратите внимание, что номера сообщений IMAP4 меняются при изменении почтового ящика; в частности, после выполнения команды `EXPUNGE`, которая удаляет сообщения, оставшиеся перенумеровываются. Поэтому настоятельно рекомендуется использовать UID с командой UID.9697В конце модуля есть тестовый раздел, содержащий более полный пример использования.9899> **См. также**100>101> Документы, описывающие протокол, исходные коды серверов, реализующих его, от Информационного центра IMAP Вашингтонского университета, можно найти по адресу (**Source Code**) [https://github.com/uw-imap/imap](https://python-all.ru/3.11/library/imaplib.html) (**Not Maintained**).102103## Объекты IMAP4104105Все команды IMAP4rev1 представлены методами с теми же именами, в верхнем или нижнем регистре.106107Все аргументы команд преобразуются в строки, за исключением `AUTHENTICATE`, и последнего аргумента для `APPEND`, который передаётся как литерал IMAP4. При необходимости (строка содержит чувствительные к протоколу IMAP4 символы и не заключена в круглые скобки или двойные кавычки) каждая строка заключается в кавычки. Однако аргумент *password* команды `LOGIN` всегда заключается в кавычки. Если требуется избежать заключения строки аргумента в кавычки (например, аргумент *flags* для `STORE`), то строку следует заключить в круглые скобки (например, `r'(\Deleted)'`).108109Каждая команда возвращает кортеж: `(type, [data, ...])`, где *type* обычно является `'OK'` или `'NO'`, а *data* – это либо текст ответа команды, либо обязательные результаты команды. Каждое *data* – это либо `bytes`, либо кортеж. Если кортеж, то первая часть – заголовок ответа, а вторая часть содержит данные (т.е. «literal» значение).110111Параметр *message\_set* в командах ниже – это строка, задающая одно или несколько сообщений, над которыми нужно выполнить действие. Это может быть простой номер сообщения (`'1'`), диапазон номеров сообщений (`'2:4'`) или группа несмежных диапазонов, разделённых запятыми (`'1:3,6:9'`). Диапазон может содержать звёздочку для обозначения бесконечной верхней границы (`'3:*'`).112113Экземпляр [`IMAP4`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4) имеет следующие методы:114115#### `IMAP4.append(mailbox, flags, date_time, message)`116117Добавляет *message* в указанный почтовый ящик.118119#### `IMAP4.authenticate(mechanism, authobject)`120121Команда аутентификации – требуется обработка ответа.122123*mechanism* указывает, какой механизм аутентификации следует использовать – он должен присутствовать в переменной экземпляра `capabilities` в форме `AUTH=mechanism`.124125*authobject* должен быть вызываемым объектом:126127```python128data = authobject(response)129```130131Он будет вызываться для обработки ответов продолжения сервера; передаваемый ему аргумент *response* будет равен `bytes`. Он должен возвращать `bytes` *data*, которые будут закодированы в base64 и отправлены на сервер. Он должен возвращать `None`, если вместо этого следует отправить ответ прерывания клиента `*`.132133Изменено в версии 3.5: теперь строковые имена пользователей и пароли кодируются в `utf-8`, а не ограничиваются ASCII.134135#### `IMAP4.check()`136137Контрольная точка почтового ящика на сервере.138139#### `IMAP4.close()`140141Закрывает текущий выбранный почтовый ящик. Удалённые сообщения удаляются из почтового ящика с правом записи. Это рекомендуемая команда перед `LOGOUT`.142143#### `IMAP4.copy(message_set, new_mailbox)`144145Копирует сообщения *message\_set* в конец *new\_mailbox*.146147#### `IMAP4.create(mailbox)`148149Создаёт новый почтовый ящик с именем *mailbox*.150151#### `IMAP4.delete(mailbox)`152153Удаляет старый почтовый ящик с именем *mailbox*.154155#### `IMAP4.deleteacl(mailbox, who)`156157Удалить ACL (убрать все права), установленные для who на mailbox.158159#### `IMAP4.enable(capability)`160161Включить возможность (capability) *capability* (см. [**RFC 5161**](https://python-all.ru/3.11/library/imaplib.html)). Большинство возможностей не нужно включать. Сейчас поддерживается только возможность из `UTF8=ACCEPT` (см. [**RFC 6855**](https://python-all.ru/3.11/library/imaplib.html)).162163Новое в версии 3.5: Метод [`enable()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.enable) и поддержка [**RFC 6855**](https://python-all.ru/3.11/library/imaplib.html).164165#### `IMAP4.expunge()`166167Окончательно удаляет помеченные на удаление письма из выбранного почтового ящика. Генерирует `EXPUNGE`-ответ для каждого удалённого сообщения. Возвращаемые данные содержат список `EXPUNGE` номеров сообщений в порядке их получения.168169#### `IMAP4.fetch(message_set, message_parts)`170171Извлекает (части) сообщений. *message\_parts* должна быть строкой с именами частей сообщения, заключёнными в круглые скобки, например: `"(UID BODY[TEXT])"`. Возвращаемые данные – это кортежи, содержащие конверт (envelope) и данные части сообщения.172173#### `IMAP4.getacl(mailbox)`174175Получает `ACL` для *mailbox*. Метод нестандартный, но поддерживается сервером `Cyrus`.176177#### `IMAP4.getannotation(mailbox, entry, attribute)`178179Извлекает указанные `ANNOTATION` для *mailbox*. Метод нестандартный, но поддерживается сервером `Cyrus`.180181#### `IMAP4.getquota(root)`182183Получает использование ресурсов и лимиты для `quota` *root*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.184185#### `IMAP4.getquotaroot(mailbox)`186187Получает список `quota` `roots` для указанного *mailbox*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.188189#### `IMAP4.list([directory[, pattern]])`190191Перечисляет имена почтовых ящиков в *directory*, соответствующие *pattern*. *directory* по умолчанию является корневой папкой почты, а *pattern* по умолчанию соответствует всему. Возвращаемые данные содержат список ответов `LIST`.192193#### `IMAP4.login(user, password)`194195Идентифицирует клиента с помощью пароля в открытом виде. Параметр *password* будет заключён в кавычки.196197#### `IMAP4.login_cram_md5(user, password)`198199Принудительно использует аутентификацию `CRAM-MD5` для защиты пароля при идентификации клиента. Сработает, только если ответ сервера `CAPABILITY` содержит фразу `AUTH=CRAM-MD5`.200201#### `IMAP4.logout()`202203Закрывает соединение с сервером. Возвращает ответ сервера `BYE`.204205Изменено в версии 3.8: Метод больше не игнорирует любые исключения без уведомления.206207#### `IMAP4.lsub(directory='""', pattern='*')`208209Выводит список подписанных почтовых ящиков в указанном каталоге, соответствующих шаблону. По умолчанию *directory* – корневой каталог, а *pattern* – любой почтовый ящик. Возвращаемые данные – кортежи из конверта части сообщения и данных.210211#### `IMAP4.myrights(mailbox)`212213Показывает списки управления доступом (ACL) почтового ящика (т.е. права, которые у клиента есть на этот ящик).214215#### `IMAP4.namespace()`216217Возвращает пространства имён IMAP, определённые в [**RFC 2342**](https://python-all.ru/3.11/library/imaplib.html).218219#### `IMAP4.noop()`220221Отправляет `NOOP` на сервер.222223#### `IMAP4.open(host, port, timeout=None)`224225Открывает сокет к *port* на *host*. Необязательный параметр *timeout* задаёт тайм-аут в секундах для попытки подключения. Если timeout не указан или равен None, используется глобальный тайм-аут сокета по умолчанию. Также учтите, что если параметр *timeout* установлен в ноль, будет вызвано [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError) для отказа от создания неблокирующего сокета. Этот метод неявно вызывается конструктором [`IMAP4`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4). Объекты соединения, установленные этим методом, будут использоваться в методах [`IMAP4.read()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.read), [`IMAP4.readline()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.readline), [`IMAP4.send()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.send), и [`IMAP4.shutdown()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.shutdown). Этот метод можно переопределить.226227Вызывает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `imaplib.open` с аргументами `self`, `host`, `port`.228229Изменено в версии 3.9: Добавлен параметр *timeout*.230231#### `IMAP4.partial(message_num, message_part, start, length)`232233Извлекает усечённую часть сообщения. Возвращаемые данные – кортеж из конверта части сообщения и данных.234235#### `IMAP4.proxyauth(user)`236237Предполагает аутентификацию от имени пользователя *user*. Позволяет авторизованному администратору выполнять прокси-доступ к почтовому ящику любого пользователя.238239#### `IMAP4.read(size)`240241Читает *size* байт с удалённого сервера. Этот метод можно переопределить.242243#### `IMAP4.readline()`244245Читает одну строку с удалённого сервера. Этот метод можно переопределить.246247#### `IMAP4.recent()`248249Запрашивает у сервера обновление. Возвращаемые данные – `None`, если нет новых сообщений, иначе значение ответа `RECENT`.250251#### `IMAP4.rename(oldmailbox, newmailbox)`252253Переименовывает почтовый ящик с именем *oldmailbox* в *newmailbox*.254255#### `IMAP4.response(code)`256257Возвращает данные для *кода* ответа, если он получен, или `None`. Возвращает указанный код вместо обычного типа.258259#### `IMAP4.search(charset, criterion[, ...])`260261Ищет в почтовом ящике сообщения, соответствующие условиям. *charset* может быть `None`, и в этом случае `CHARSET` не будет указан в запросе к серверу. Протокол IMAP требует указать хотя бы один критерий; при ошибке со стороны сервера будет возбуждено исключение. *charset* должен быть `None`, если возможность `UTF8=ACCEPT` была включена с помощью команды [`enable()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.enable).262263Пример:264265```python266# M – это подключенный экземпляр IMAP4...267typ, msgnums = M.search(None, 'FROM', '"LDJ"')268269# или:270typ, msgnums = M.search(None, '(FROM "LDJ")')271```272273#### `IMAP4.select(mailbox='INBOX', readonly=False)`274275Выбирает почтовый ящик. Возвращаемые данные – количество сообщений в *mailbox* (ответ `EXISTS`). По умолчанию *mailbox* равен `'INBOX'`. Если установлен флаг *readonly*, изменения в почтовом ящике запрещены.276277#### `IMAP4.send(data)`278279Отправляет `data` на удалённый сервер. Этот метод можно переопределить.280281Возбуждает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `imaplib.send` с аргументами `self`, `data`.282283#### `IMAP4.setacl(mailbox, who, what)`284285Устанавливает `ACL` для *mailbox*. Метод является нестандартным, но поддерживается сервером `Cyrus`.286287#### `IMAP4.setannotation(mailbox, entry, attribute[, ...])`288289Устанавливает `ANNOTATION` для *mailbox*. Метод является нестандартным, но поддерживается сервером `Cyrus`.290291#### `IMAP4.setquota(root, limits)`292293Устанавливает `quota` ресурса *root* – *limits*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.294295#### `IMAP4.shutdown()`296297Закрывает соединение, установленное в `open`. Этот метод неявно вызывается методом [`IMAP4.logout()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.logout). Этот метод можно переопределить.298299#### `IMAP4.socket()`300301Возвращает экземпляр сокета, используемый для подключения к серверу.302303#### `IMAP4.sort(sort_criteria, charset, search_criterion[, ...])`304305Команда `sort` является вариантом `search` с семантикой сортировки результатов. Возвращаемые данные содержат список номеров подходящих сообщений, разделённых пробелами.306307Sort имеет два аргумента перед аргументом(ами) *search\_criterion*: список *sort\_criteria* в скобках и поисковый *charset*. Обратите внимание: в отличие от `search`, аргумент *charset* является обязательным. Также существует команда `uid sort`, которая соответствует `sort` так же, как `uid search` соответствует `search`. Команда `sort` сначала ищет в почтовом ящике сообщения, соответствующие заданным критериям поиска, используя аргумент charset для интерпретации строк в критериях поиска. Затем она возвращает номера подходящих сообщений.308309Это команда расширения `IMAP4rev1`.310311#### `IMAP4.starttls(ssl_context=None)`312313Отправляет команду `STARTTLS`. Аргумент *ssl\_context* является необязательным и должен быть объектом [`ssl.SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext). Это включит шифрование в IMAP-соединении. Пожалуйста, прочитайте [рекомендации по безопасности](https://python-all.ru/3.11/library/ssl.html#ssl-security) для соблюдения лучших практик.314315Новое в версии 3.2.316317Изменено в версии 3.4: Теперь метод поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3.11/library/ssl.html#ssl.HAS_SNI)).318319#### `IMAP4.status(mailbox, names)`320321Запрашивает именованные условия состояния для *mailbox*.322323#### `IMAP4.store(message_set, command, flag_list)`324325Изменяет состояния флагов для сообщений в почтовом ящике. Параметр *command* задаётся в разделе 6.4.6 документа [**RFC 2060**](https://python-all.ru/3.11/library/imaplib.html) как одно из значений «FLAGS», «+FLAGS» или «-FLAGS», возможно с суффиксом «.SILENT».326327Например, чтобы установить флаг удаления на все сообщения:328329```python330typ, data = M.search(None, 'ALL')331for num in data[0].split():332 M.store(num, '+FLAGS', '\\Deleted')333M.expunge()334```335336> **Примечание**337>338> Создание флагов, содержащих символ ‘\]’ (например: «\[test\]»), нарушает требования [**RFC 3501**](https://python-all.ru/3.11/library/imaplib.html) (протокола IMAP). Однако imaplib исторически допускал создание таких меток, и популярные IMAP-серверы, такие как Gmail, принимают и создают такие флаги. Существуют и программы не на Python, которые также создают подобные метки. Хотя это нарушение RFC и IMAP-клиенты и серверы должны быть строгими, imaplib тем не менее продолжает разрешать создание таких меток по причинам обратной совместимости, а начиная с Python 3.6 обрабатывает их, если они приходят от сервера, так как это улучшает совместимость в реальных условиях.339340#### `IMAP4.subscribe(mailbox)`341342Подписаться на новый почтовый ящик.343344#### `IMAP4.thread(threading_algorithm, charset, search_criterion[, ...])`345346Команда `thread` является вариантом `search` с семантикой threading для результатов. Возвращаемые данные содержат разделенный пробелами список участников ветвей.347348Участники ветвей состоят из нуля или более номеров сообщений, разделенных пробелами, указывающих последовательные родительские и дочерние элементы.349350Thread has two arguments before the *search\_criterion* argument(s); a *threading\_algorithm*, and the searching *charset*. Note that unlike `search`, the searching *charset* argument is mandatory. There is also a `uid thread` command which corresponds to `thread` the way that `uid search` corresponds to `search`. The `thread` command first searches the mailbox for messages that match the given searching criteria using the charset argument for the interpretation of strings in the searching criteria. It then returns the matching messages threaded according to the specified threading algorithm.351352Это команда расширения `IMAP4rev1`.353354#### `IMAP4.uid(command, arg[, ...])`355356Выполняет команду с аргументами для сообщений, идентифицированных по UID, а не по номеру сообщения. Возвращает ответ, соответствующий команде. Должен быть указан по крайней мере один аргумент; если ни одного не передано, сервер вернет ошибку, и будет возбуждено исключение.357358#### `IMAP4.unsubscribe(mailbox)`359360Отписаться от старого почтового ящика.361362#### `IMAP4.unselect()`363364[`imaplib.IMAP4.unselect()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.unselect) освобождает ресурсы сервера, связанные с выбранным почтовым ящиком, и возвращает сервер в аутентифицированное состояние. Эта команда выполняет те же действия, что и [`imaplib.IMAP4.close()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.close), за исключением того, что сообщения не удаляются безвозвратно из текущего выбранного почтового ящика.365366Новое в версии 3.9.367368#### `IMAP4.xatom(name[, ...])`369370Позволяет простые расширенные команды, уведомляемые сервером в ответе `CAPABILITY`.371372На экземплярах [`IMAP4`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4) определены следующие атрибуты:373374#### `IMAP4.PROTOCOL_VERSION`375376Последний поддерживаемый протокол в ответе `CAPABILITY` от сервера.377378#### `IMAP4.debug`379380Целочисленное значение для управления выводом отладочной информации. Начальное значение берется из переменной модуля `Debug`. Значения больше трех трассируют каждую команду.381382#### `IMAP4.utf8_enabled`383384Логическое значение, которое обычно равно `False`, но устанавливается в `True`, если команда [`enable()`](https://python-all.ru/3.11/library/imaplib.html#imaplib.IMAP4.enable) была успешно выдана для возможности `UTF8=ACCEPT`.385386Новое в версии 3.5.387388## Пример IMAP4389390Вот минимальный пример (без проверки ошибок), который открывает почтовый ящик и извлекает и выводит все сообщения:391392```python393import getpass, imaplib394395M = imaplib.IMAP4(host='example.org')396M.login(getpass.getuser(), getpass.getpass())397M.select()398typ, data = M.search(None, 'ALL')399for num in data[0].split():400 typ, data = M.fetch(num, '(RFC822)')401 print('Message %s\n%s\n' % (num, data[0][1]))402M.close()403M.logout()404```405