Документация Python неофициальный перевод

imaplib.md

365 строк · 26.7 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/imaplib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 20.10. [`imaplib`](https://python-all.ru/2.7/library/imaplib.html#module-imaplib) – клиент протокола IMAP489**Исходный код:** [Lib/imaplib.py](https://python-all.ru/src/2.7/Lib/imaplib.py)1011---1213Этот модуль определяет три класса, [`IMAP4`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4), [`IMAP4_SSL`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4_SSL) и [`IMAP4_stream`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4_stream), которые инкапсулируют соединение с IMAP4-сервером и реализуют большую часть клиентского протокола IMAP4rev1, описанного в [**RFC 2060**](https://python-all.ru/2.7/library/imaplib.html). Он обратно совместим с IMAP4-серверами ([**RFC 1730**](https://python-all.ru/2.7/library/imaplib.html)), но следует учесть, что команда `STATUS` не поддерживается в IMAP4.1415Модуль [`imaplib`](https://python-all.ru/2.7/library/imaplib.html#module-imaplib) предоставляет три класса, [`IMAP4`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4) – это базовый класс:1617#### `class imaplib.IMAP4([host[, port]])`1819Этот класс реализует протокол IMAP4. Соединение создается, а версия протокола (IMAP4 или IMAP4rev1) определяется при инициализации экземпляра. Если *host* не указан, используется `''` (локальный хост). Если *port* опущен, используется стандартный порт IMAP4 (143).2021Три исключения определены как атрибуты класса [`IMAP4`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4):2223#### `exception IMAP4.error`2425Исключение возникает при любых ошибках. Причина исключения передаётся конструктору в виде строки.2627#### `exception IMAP4.abort`2829Ошибки сервера IMAP4 вызывают это исключение. Оно является подклассом [`IMAP4.error`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4.error). Обратите внимание, что закрытие экземпляра и создание нового обычно позволяет восстановиться после этого исключения.3031#### `exception IMAP4.readonly`3233Это исключение возникает, когда сервер изменяет статус почтового ящика, доступного для записи. Оно является подклассом [`IMAP4.error`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4.error). Теперь другой клиент имеет права на запись, и для повторного получения прав на запись необходимо заново открыть почтовый ящик.3435Также существует подкласс для безопасных соединений:3637#### `class imaplib.IMAP4_SSL([host[, port[, keyfile[, certfile]]]])`3839Это подкласс, производный от [`IMAP4`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4), который подключается через SSL-шифрованный сокет (для использования этого класса требуется модуль socket, скомпилированный с поддержкой SSL). Если *host* не указан, используется `''` (локальный хост). Если *port* опущен, используется стандартный порт IMAP4-over-SSL (993). *keyfile* и *certfile* также необязательны – они могут содержать PEM-форматированный закрытый ключ и файл цепочки сертификатов для SSL-соединения.4041Второй подкласс предназначен для соединений, создаваемых дочерним процессом:4243#### `class imaplib.IMAP4_stream(command)`4445Это подкласс, производный от [`IMAP4`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4), который подключается к файловым дескрипторам `stdin/stdout`, создаваемым путём передачи *command* в `os.popen2()`.4647Новое в версии 2.3.4849Определены следующие вспомогательные функции:5051#### `imaplib.Internaldate2tuple(datestr)`5253Разбирает строку IMAP4 `INTERNALDATE` и возвращает соответствующее местное время. Возвращаемое значение – экземпляр [`time.struct_time`](https://python-all.ru/2.7/library/time.html#time.struct_time) или `None`, если строка имеет неверный формат.5455#### `imaplib.Int2AP(num)`5657Преобразует целое число в строковое представление, используя символы из набора \[`A` .. `P`\].5859#### `imaplib.ParseFlags(flagstr)`6061Преобразует ответ IMAP4 `FLAGS` в кортеж отдельных флагов.6263#### `imaplib.Time2Internaldate(date_time)`6465Преобразует *date\_time* в представление IMAP4 `INTERNALDATE`. Возвращаемое значение – строка вида: `"DD-Mmm-YYYY HH:MM:SS +HHMM"` (включая двойные кавычки). Аргумент *date\_time* может быть числом (int или float), представляющим секунды с начала эпохи (как возвращает [`time.time()`](https://python-all.ru/2.7/library/time.html#time.time)), 9-кортежем, представляющим местное время (как возвращает [`time.localtime()`](https://python-all.ru/2.7/library/time.html#time.localtime)), или строкой в двойных кавычках. В последнем случае предполагается, что она уже имеет правильный формат.6667Обратите внимание, что номера сообщений IMAP4 меняются при изменении почтового ящика; в частности, после выполнения команды `EXPUNGE`, которая удаляет сообщения, оставшиеся перенумеровываются. Поэтому настоятельно рекомендуется использовать UID с командой UID.6869В конце модуля есть тестовый раздел, содержащий более полный пример использования.7071> **См. также**72>73> Документы, описывающие протокол, а также исходные коды и бинарные файлы для серверов, реализующих его, можно найти в *IMAP Information Center* Вашингтонского университета ([https://www.washington.edu/imap/](https://python-all.ru/2.7/library/imaplib.html)).7475## 20.10.1. Объекты IMAP47677Все команды IMAP4rev1 представлены методами с теми же именами, в верхнем или нижнем регистре.7879Все аргументы команд преобразуются в строки, за исключением `AUTHENTICATE`, и последнего аргумента для `APPEND`, который передаётся как литерал IMAP4. При необходимости (строка содержит чувствительные к протоколу IMAP4 символы и не заключена в круглые скобки или двойные кавычки) каждая строка заключается в кавычки. Однако аргумент *password* команды `LOGIN` всегда заключается в кавычки. Если требуется избежать заключения строки аргумента в кавычки (например, аргумент *flags* для `STORE`), то строку следует заключить в круглые скобки (например, `r'(\Deleted)'`).8081Каждая команда возвращает кортеж: `(type, [data, ...])`, где *type* обычно равен `'OK'` или `'NO'`, а *data* – это либо текст ответа команды, либо обязательные результаты команды. Каждый *data* – это либо строка, либо кортеж. Если кортеж, то первая часть – заголовок ответа, а вторая часть содержит данные (то есть буквальное значение).8283Параметр *message\_set* в командах ниже – это строка, задающая одно или несколько сообщений, над которыми нужно выполнить действие. Это может быть простой номер сообщения (`'1'`), диапазон номеров сообщений (`'2:4'`) или группа несмежных диапазонов, разделённых запятыми (`'1:3,6:9'`). Диапазон может содержать звёздочку для обозначения бесконечной верхней границы (`'3:*'`).8485Экземпляр [`IMAP4`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4) имеет следующие методы:8687#### `IMAP4.append(mailbox, flags, date_time, message)`8889Добавляет *message* в указанный почтовый ящик.9091#### `IMAP4.authenticate(mechanism, authobject)`9293Команда аутентификации – требуется обработка ответа.9495*mechanism* указывает, какой механизм аутентификации следует использовать – он должен присутствовать в переменной экземпляра `capabilities` в форме `AUTH=mechanism`.9697*authobject* должен быть вызываемым объектом:9899```python100data = authobject(response)101```102103Она будет вызвана для обработки ответов продолжения сервера. Она должна возвращать `data`, который будет закодирован и отправлен серверу. Она должна возвращать `None`, если вместо этого следует отправить ответ клиента об отмене `*`.104105#### `IMAP4.check()`106107Контрольная точка почтового ящика на сервере.108109#### `IMAP4.close()`110111Закрывает текущий выбранный почтовый ящик. Удалённые сообщения удаляются из почтового ящика с правом записи. Это рекомендуемая команда перед `LOGOUT`.112113#### `IMAP4.copy(message_set, new_mailbox)`114115Копирует сообщения *message\_set* в конец *new\_mailbox*.116117#### `IMAP4.create(mailbox)`118119Создаёт новый почтовый ящик с именем *mailbox*.120121#### `IMAP4.delete(mailbox)`122123Удаляет старый почтовый ящик с именем *mailbox*.124125#### `IMAP4.deleteacl(mailbox, who)`126127Удалить ACL (убрать все права), установленные для who на mailbox.128129Новое в версии 2.4.130131#### `IMAP4.expunge()`132133Окончательно удаляет помеченные на удаление письма из выбранного почтового ящика. Генерирует `EXPUNGE`-ответ для каждого удалённого сообщения. Возвращаемые данные содержат список `EXPUNGE` номеров сообщений в порядке их получения.134135#### `IMAP4.fetch(message_set, message_parts)`136137Извлекает (части) сообщений. *message\_parts* должна быть строкой с именами частей сообщения, заключёнными в круглые скобки, например: `"(UID BODY[TEXT])"`. Возвращаемые данные – это кортежи, содержащие конверт (envelope) и данные части сообщения.138139#### `IMAP4.getacl(mailbox)`140141Получает `ACL` для *mailbox*. Метод нестандартный, но поддерживается сервером `Cyrus`.142143#### `IMAP4.getannotation(mailbox, entry, attribute)`144145Извлекает указанные `ANNOTATION` для *mailbox*. Метод нестандартный, но поддерживается сервером `Cyrus`.146147Новое в версии 2.5.148149#### `IMAP4.getquota(root)`150151Получает использование ресурсов и лимиты для `quota` *root*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.152153Новое в версии 2.3.154155#### `IMAP4.getquotaroot(mailbox)`156157Получает список `quota` `roots` для указанного *mailbox*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.158159Новое в версии 2.3.160161#### `IMAP4.list([directory='""', pattern='*'pattern]])`162163Перечисляет имена почтовых ящиков в *directory*, соответствующие *pattern*. *directory* по умолчанию является корневой папкой почты, а *pattern* по умолчанию соответствует всему. Возвращаемые данные содержат список ответов `LIST`.164165#### `IMAP4.login(user, password)`166167Идентифицирует клиента с помощью пароля в открытом виде. Параметр *password* будет заключён в кавычки.168169#### `IMAP4.login_cram_md5(user, password)`170171Принудительно использует аутентификацию `CRAM-MD5` для защиты пароля при идентификации клиента. Сработает, только если ответ сервера `CAPABILITY` содержит фразу `AUTH=CRAM-MD5`.172173Новое в версии 2.3.174175#### `IMAP4.logout()`176177Закрывает соединение с сервером. Возвращает ответ сервера `BYE`.178179#### `IMAP4.lsub([directory='""', pattern='*'pattern]])`180181Выводит список подписанных почтовых ящиков в указанном каталоге, соответствующих шаблону. По умолчанию *directory* – корневой каталог, а *pattern* – любой почтовый ящик. Возвращаемые данные – кортежи из конверта части сообщения и данных.182183#### `IMAP4.myrights(mailbox)`184185Показывает списки управления доступом (ACL) почтового ящика (т.е. права, которые у клиента есть на этот ящик).186187Новое в версии 2.4.188189#### `IMAP4.namespace()`190191Возвращает пространства имён IMAP согласно RFC2342.192193Новое в версии 2.3.194195#### `IMAP4.noop()`196197Отправляет `NOOP` на сервер.198199#### `IMAP4.open(host, port)`200201Открывает сокет к *port* на *host*. Этот метод неявно вызывается конструктором [`IMAP4`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4). Объекты соединения, установленные этим методом, будут использоваться в методах [`IMAP4.read()`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4.read), [`IMAP4.readline()`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4.readline), [`IMAP4.send()`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4.send) и [`IMAP4.shutdown()`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4.shutdown). Можно переопределить этот метод.202203#### `IMAP4.partial(message_num, message_part, start, length)`204205Извлекает усечённую часть сообщения. Возвращаемые данные – кортеж из конверта части сообщения и данных.206207#### `IMAP4.proxyauth(user)`208209Предполагает аутентификацию от имени пользователя *user*. Позволяет авторизованному администратору выполнять прокси-доступ к почтовому ящику любого пользователя.210211Новое в версии 2.3.212213#### `IMAP4.read(size)`214215Читает *size* байт с удалённого сервера. Этот метод можно переопределить.216217#### `IMAP4.readline()`218219Читает одну строку с удалённого сервера. Этот метод можно переопределить.220221#### `IMAP4.recent()`222223Запрашивает у сервера обновление. Возвращаемые данные – `None`, если нет новых сообщений, иначе значение ответа `RECENT`.224225#### `IMAP4.rename(oldmailbox, newmailbox)`226227Переименовывает почтовый ящик с именем *oldmailbox* в *newmailbox*.228229#### `IMAP4.response(code)`230231Возвращает данные для *кода* ответа, если он получен, или `None`. Возвращает указанный код вместо обычного типа.232233#### `IMAP4.search(charset, criterion[, ...])`234235Поиск в почтовом ящике сообщений, соответствующих критериям. *charset* может быть `None`, и в этом случае в запросе к серверу не будет указано `CHARSET`. Протокол IMAP требует указания хотя бы одного критерия; будет возбуждено исключение, если сервер вернёт ошибку.236237Пример:238239```python240# M – это подключенный экземпляр IMAP4...241typ, msgnums = M.search(None, 'FROM', '"LDJ"')242243# или:244typ, msgnums = M.search(None, '(FROM "LDJ")')245```246247#### `IMAP4.select([mailbox[, readonly]])`248249Выбирает почтовый ящик. Возвращаемые данные – количество сообщений в *mailbox* (ответ `EXISTS`). По умолчанию *mailbox* равен `'INBOX'`. Если установлен флаг *readonly*, изменения в почтовом ящике запрещены.250251#### `IMAP4.send(data)`252253Отправляет `data` на удалённый сервер. Этот метод можно переопределить.254255#### `IMAP4.setacl(mailbox, who, what)`256257Устанавливает `ACL` для *mailbox*. Метод является нестандартным, но поддерживается сервером `Cyrus`.258259#### `IMAP4.setannotation(mailbox, entry, attribute[, ...])`260261Устанавливает `ANNOTATION` для *mailbox*. Метод является нестандартным, но поддерживается сервером `Cyrus`.262263Новое в версии 2.5.264265#### `IMAP4.setquota(root, limits)`266267Устанавливает `quota` ресурса *root**limits*. Этот метод является частью расширения IMAP4 QUOTA, определённого в rfc2087.268269Новое в версии 2.3.270271#### `IMAP4.shutdown()`272273Закрывает соединение, установленное в `open`. Этот метод неявно вызывается методом [`IMAP4.logout()`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4.logout). Этот метод можно переопределить.274275#### `IMAP4.socket()`276277Возвращает экземпляр сокета, используемый для подключения к серверу.278279#### `IMAP4.sort(sort_criteria, charset, search_criterion[, ...])`280281Команда `sort` является вариантом `search` с семантикой сортировки результатов. Возвращаемые данные содержат список номеров подходящих сообщений, разделённых пробелами.282283Sort имеет два аргумента перед аргументом(ами) *search\_criterion*: список *sort\_criteria* в скобках и поисковый *charset*. Обратите внимание: в отличие от `search`, аргумент *charset* является обязательным. Также существует команда `uid sort`, которая соответствует `sort` так же, как `uid search` соответствует `search`. Команда `sort` сначала ищет в почтовом ящике сообщения, соответствующие заданным критериям поиска, используя аргумент charset для интерпретации строк в критериях поиска. Затем она возвращает номера подходящих сообщений.284285Это команда расширения `IMAP4rev1`.286287#### `IMAP4.status(mailbox, names)`288289Запрашивает именованные условия состояния для *mailbox*.290291#### `IMAP4.store(message_set, command, flag_list)`292293Изменяет состояния флагов для сообщений в почтовом ящике. Параметр *command* задаётся в разделе 6.4.6 документа [**RFC 2060**](https://python-all.ru/2.7/library/imaplib.html) как одно из значений «FLAGS», «+FLAGS» или «-FLAGS», возможно с суффиксом «.SILENT».294295Например, чтобы установить флаг удаления на все сообщения:296297```python298typ, data = M.search(None, 'ALL')299for num in data[0].split():300   M.store(num, '+FLAGS', '\\Deleted')301M.expunge()302```303304#### `IMAP4.subscribe(mailbox)`305306Подписаться на новый почтовый ящик.307308#### `IMAP4.thread(threading_algorithm, charset, search_criterion[, ...])`309310Команда `thread` является вариантом `search` с семантикой threading для результатов. Возвращаемые данные содержат разделенный пробелами список участников ветвей.311312Участники ветвей состоят из нуля или более номеров сообщений, разделенных пробелами, указывающих последовательные родительские и дочерние элементы.313314Thread 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.315316Это команда расширения `IMAP4rev1`.317318Новое в версии 2.4.319320#### `IMAP4.uid(command, arg[, ...])`321322Выполняет команду с аргументами для сообщений, идентифицированных по UID, а не по номеру сообщения. Возвращает ответ, соответствующий команде. Должен быть указан по крайней мере один аргумент; если ни одного не передано, сервер вернет ошибку, и будет возбуждено исключение.323324#### `IMAP4.unsubscribe(mailbox)`325326Отписаться от старого почтового ящика.327328#### `IMAP4.xatom(name[, arg[, ...]])`329330Позволяет простые расширенные команды, уведомляемые сервером в ответе `CAPABILITY`.331332Экземпляры [`IMAP4_SSL`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4_SSL) имеют только один дополнительный метод:333334#### `IMAP4_SSL.ssl()`335336Возвращает экземпляр SSLObject, используемый для безопасного соединения с сервером.337338На экземплярах [`IMAP4`](https://python-all.ru/2.7/library/imaplib.html#imaplib.IMAP4) определены следующие атрибуты:339340#### `IMAP4.PROTOCOL_VERSION`341342Последний поддерживаемый протокол в ответе `CAPABILITY` от сервера.343344#### `IMAP4.debug`345346Целочисленное значение для управления выводом отладочной информации. Начальное значение берется из переменной модуля `Debug`. Значения больше трех трассируют каждую команду.347348## 20.10.2. Пример IMAP4349350Вот минимальный пример (без проверки ошибок), который открывает почтовый ящик и извлекает и выводит все сообщения:351352```python353import getpass, imaplib354355M = imaplib.IMAP4()356M.login(getpass.getuser(), getpass.getpass())357M.select()358typ, data = M.search(None, 'ALL')359for num in data[0].split():360    typ, data = M.fetch(num, '(RFC822)')361    print 'Message %s\n%s\n' % (num, data[0][1])362M.close()363M.logout()364```365