imaplib — клиент протокола IMAP4
Исходный код: Lib/imaplib.py
Этот модуль определяет три класса: IMAP4, IMAP4_SSL и IMAP4_stream, которые инкапсулируют подключение к серверу IMAP4 и реализуют большую часть протокола клиента IMAP4rev1, определённого в RFC 2060. Модуль обратно совместим с серверами IMAP4 (RFC 1730), но обратите внимание, что команда STATUS в IMAP4 не поддерживается.
Доступность: не WASI.
Этот модуль не работает или недоступен в WebAssembly. Подробнее см. в разделе Платформы WebAssembly.
Модуль imaplib предоставляет три класса; IMAP4 является базовым классом:
-
class imaplib.IMAP4(host='', port=IMAP4_PORT, timeout=None) -
Этот класс реализует собственно протокол IMAP4. Подключение создаётся, а версия протокола (IMAP4 или IMAP4rev1) определяется при инициализации экземпляра. Если host не указан, используется
''(локальный хост). Если port не указан, используется стандартный порт IMAP4 (143). Необязательный параметр timeout задаёт время ожидания подключения в секундах. Если параметр timeout не задан или равенNone, используется глобальное значение времени ожидания сокета по умолчанию.Класс
IMAP4поддерживает инструкциюwith. При таком использовании команда IMAP4LOGOUTавтоматически выполняется при выходе из инструкцииwith. Например:>>> from imaplib import IMAP4 >>> with IMAP4("domain.org") as M: ... M.noop() ... ('OK', [b'Nothing Accomplished. d25if65hy903weo.87'])Изменено в версии 3.5: Добавлена поддержка инструкции
with.Изменено в версии 3.9: Добавлен необязательный параметр timeout.
Класс IMAP4 определяет три исключения в качестве атрибутов:
-
exception IMAP4.error -
Исключение, возникающее при любых ошибках. Причина исключения передаётся конструктору в виде строки.
-
exception IMAP4.abort -
Эта ошибка возникает при ошибках сервера IMAP4. Это подкласс
IMAP4.error. Обратите внимание: закрытие экземпляра и создание нового обычно позволяет восстановиться после этого исключения.
-
exception IMAP4.readonly -
Это исключение возникает, когда сервер меняет статус доступного для записи почтового ящика. Это подкласс
IMAP4.error. Теперь другой клиент имеет разрешение на запись, и почтовый ящик необходимо открыть заново, чтобы снова получить разрешение на запись.
Также имеется подкласс для защищённых подключений:
-
class imaplib.IMAP4_SSL(host='', port=IMAP4_SSL_PORT, *, ssl_context=None, timeout=None) -
Это подкласс
IMAP4, который подключается через зашифрованный SSL-сокет (для использования этого класса необходим модуль socket, скомпилированный с поддержкой SSL). Если host не указан, используется''(локальный хост). Если port не указан, используется стандартный порт IMAP4 через SSL (993). ssl_context — это объектssl.SSLContext, который позволяет объединить параметры конфигурации SSL, сертификаты и закрытые ключи в одну (потенциально долгоживущую) структуру. Рекомендации по передовым методам см. в разделе Вопросы безопасности.Необязательный параметр timeout задаёт время ожидания подключения в секундах. Если параметр timeout не задан или равен
None, используется глобальное значение времени ожидания сокета по умолчанию.Изменено в версии 3.3: Добавлен параметр ssl_context.
Изменено в версии 3.4: Теперь класс поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostnameи Server Name Indication (см.ssl.HAS_SNI).Изменено в версии 3.9: Добавлен необязательный параметр timeout.
Изменено в версии 3.12: Устаревшие параметры keyfile и certfile удалены.
Второй подкласс позволяет использовать подключения, созданные дочерним процессом:
-
class imaplib.IMAP4_stream(command) -
Это подкласс
IMAP4, который подключается к файловым дескрипторамstdin/stdout, созданным при передаче command вsubprocess.Popen().
Определены следующие служебные функции:
-
imaplib.Internaldate2tuple(datestr) -
Разбирает строку
INTERNALDATEIMAP4 и возвращает соответствующее местное время. Возвращаемое значение — кортежtime.struct_timeилиNone, если строка имеет неверный формат.
-
imaplib.Int2AP(num) -
Преобразует целое число в представление в виде байтов, используя символы из набора [
A..P].
-
imaplib.ParseFlags(flagstr) -
Преобразует ответ
FLAGSIMAP4 в кортеж отдельных флагов.
-
imaplib.Time2Internaldate(date_time) -
Преобразует date_time в представление
INTERNALDATEIMAP4. Возвращаемое значение — строка следующего формата:"DD-Mmm-YYYY HH:MM:SS +HHMM"(включая двойные кавычки). Аргументом date_time может быть число (int или float), представляющее количество секунд с начала эпохи (как возвращаемое функциейtime.time()), 9-элементный кортеж, представляющий местное время, экземплярtime.struct_time(как возвращаемый функциейtime.localtime()), экземплярdatetime.datetimeс часовым поясом или строка в двойных кавычках. В последнем случае предполагается, что строка уже имеет нужный формат.
Обратите внимание, что номера сообщений IMAP4 меняются при изменении почтового ящика; в частности, после того как команда EXPUNGE удалит сообщения, оставшиеся сообщения перенумеровываются. Поэтому настоятельно рекомендуется использовать UID вместо номеров сообщений, применяя команду UID.
В конце модуля находится раздел с тестами, содержащий более подробный пример использования.
См. также
Документы с описанием протокола и исходный код серверов, реализующих его, от Центра информации IMAP Университета Вашингтона можно найти по адресу (Исходный код) https://github.com/uw-imap/imap (Не поддерживается).
Объекты IMAP4
Все команды IMAP4rev1 представлены методами с такими же именами, написанными прописными или строчными буквами.
Все аргументы команд преобразуются в строки, за исключением AUTHENTICATE и последнего аргумента APPEND, который передаётся как литерал IMAP4. При необходимости (если строка содержит символы, чувствительные к протоколу IMAP4, и не заключена в круглые скобки или двойные кавычки) каждая строка заключается в кавычки. Однако аргумент password команды LOGIN всегда заключается в кавычки. Если требуется избежать заключения строки-аргумента в кавычки (например, аргумента flags команды STORE), заключите строку в круглые скобки (например: r'(\Deleted)').
Каждая команда возвращает кортеж: (type, [data, ...]), где type обычно равен 'OK' или 'NO', а data содержит либо текст ответа команды, либо предусмотренные командой результаты. Каждый элемент data — это либо bytes, либо кортеж. Если это кортеж, первая часть содержит заголовок ответа, а вторая — данные (то есть значение «литерала»).
Параметр message_set команд, описанных ниже, — это строка, задающая одно или несколько сообщений, к которым применяется команда. Это может быть простой номер сообщения ('1'), диапазон номеров сообщений ('2:4') или группа непоследовательных диапазонов, разделённых запятыми ('1:3,6:9'). Диапазон может содержать звёздочку, обозначающую бесконечную верхнюю границу ('3:*').
Экземпляр IMAP4 имеет следующие методы:
-
IMAP4.append(mailbox, flags, date_time, message) -
Добавляет message в указанную почтовую папку.
-
IMAP4.authenticate(mechanism, authobject) -
Команда аутентификации — требует обработки ответа.
Параметр mechanism задаёт используемый механизм аутентификации — он должен присутствовать в переменной экземпляра
capabilitiesв видеAUTH=mechanism.authobject должен быть вызываемым объектом:
data = authobject(response)
Он будет вызван для обработки ответов-продолжений сервера; передаваемый ему аргумент response будет иметь значение
bytes. Он должен возвращатьbytesdata, которые будут закодированы в Base64 и отправлены серверу. Если клиенту нужно отправить ответ об отмене*, вместо этого следует вернутьNone.Изменено в версии 3.5: имена пользователей и пароли в виде строк теперь кодируются в
utf-8, а не ограничиваются ASCII.
-
IMAP4.check() -
Выполняет контрольную проверку почтовой папки на сервере.
-
IMAP4.close() -
Закрывает текущую выбранную почтовую папку. Удалённые сообщения удаляются из доступной для записи почтовой папки. Перед вызовом
LOGOUTрекомендуется выполнять именно эту команду.
-
IMAP4.copy(message_set, new_mailbox) -
Копирует сообщения message_set в конец new_mailbox.
-
IMAP4.create(mailbox) -
Создаёт новую почтовую папку с именем mailbox.
-
IMAP4.delete(mailbox) -
Удаляет существующую почтовую папку с именем mailbox.
-
IMAP4.deleteacl(mailbox, who) -
Удаляет ACL (снимает все права), установленные для пользователя в почтовой папке.
-
IMAP4.enable(capability) -
Включает capability (см. RFC 5161). Большинство возможностей не требуется включать. В настоящее время поддерживается только возможность
UTF8=ACCEPT(см. RFC 6855).
-
IMAP4.expunge() -
Окончательно удаляет удалённые элементы из выбранной почтовой папки. Для каждого удалённого сообщения формирует ответ
EXPUNGE. Возвращаемые данные содержат список номеров сообщенийEXPUNGEв порядке их получения.
-
IMAP4.fetch(message_set, message_parts) -
Получает сообщения или их части. message_parts должен быть строкой с именами частей сообщения в круглых скобках, например:
"(UID BODY[TEXT])". Возвращаемые данные — это кортежи, содержащие оболочку и данные части сообщения.
-
IMAP4.getacl(mailbox) -
Получает
ACLдля mailbox. Метод нестандартный, но поддерживается серверомCyrus.
-
IMAP4.getannotation(mailbox, entry, attribute) -
Получает указанные
ANNOTATIONдля mailbox. Метод нестандартный, но поддерживается серверомCyrus.
-
IMAP4.getquota(root) -
Получает сведения об использовании ресурсов и ограничениях для корня
quotaroot. Этот метод входит в расширение IMAP4 QUOTA, определённое в rfc2087.
-
IMAP4.getquotaroot(mailbox) -
Получает список
quotarootsдля указанной mailbox. Этот метод входит в расширение IMAP4 QUOTA, определённое в rfc2087.
-
IMAP4.list([directory[, pattern]]) -
Выводит имена почтовых папок в directory, соответствующие шаблону pattern. По умолчанию directory — это папка верхнего уровня, а pattern соответствует любому имени. Возвращаемые данные содержат список ответов
LIST.
-
IMAP4.login(user, password) -
Идентифицирует клиента с помощью пароля в открытом виде. Значение password заключается в кавычки.
-
IMAP4.login_cram_md5(user, password) -
Принудительно использует аутентификацию
CRAM-MD5при идентификации клиента для защиты пароля. Работает, только если ответCAPABILITYсервера содержит фразуAUTH=CRAM-MD5.Изменено в версии 3.13.8: если поддержка MD5 недоступна, возбуждается исключение
IMAP4.error.
-
IMAP4.logout() -
Закрывает соединение с сервером. Возвращает ответ сервера
BYE.Изменено в версии 3.8: метод больше не игнорирует без предупреждения произвольные исключения.
-
IMAP4.lsub(directory='""', pattern='*') -
Выводит имена почтовых папок, на которые оформлена подписка, в каталоге, соответствующем шаблону. По умолчанию directory — каталог верхнего уровня, а pattern соответствует любой почтовой папке. Возвращаемые данные — это кортежи, содержащие оболочку и данные части сообщения.
-
IMAP4.myrights(mailbox) -
Показывает мои ACL для почтовой папки (то есть мои права доступа к ней).
-
IMAP4.namespace() -
Возвращает пространства имён IMAP, определённые в RFC 2342.
-
IMAP4.noop() -
Отправляет серверу
NOOP.
-
IMAP4.open(host, port, timeout=None) -
Открывает сокет для port на узле host. Необязательный параметр timeout задаёт время ожидания попытки подключения в секундах. Если параметр timeout не указан или равен
None, используется глобальное значение времени ожидания сокета по умолчанию. Обратите внимание: если параметру timeout задано значение ноль, будет возбуждено исключениеValueError, поскольку создание неблокирующего сокета запрещено. Этот метод неявно вызывается конструкторомIMAP4. Объекты соединения, созданные этим методом, используются методамиIMAP4.read(),IMAP4.readline(),IMAP4.send()иIMAP4.shutdown(). Этот метод можно переопределить.Вызывает событие аудита
imaplib.openс аргументамиself,host,port.Изменено в версии 3.9: добавлен параметр timeout.
-
IMAP4.partial(message_num, message_part, start, length) -
Получает усечённую часть сообщения. Возвращаемые данные — это кортеж, содержащий оболочку и данные части сообщения.
-
IMAP4.proxyauth(user) -
Выполняет аутентификацию от имени пользователя user. Позволяет авторизованному администратору получить доступ к почтовой папке любого пользователя через прокси.
-
IMAP4.read(size) -
Читает size байт с удалённого сервера. Этот метод можно переопределить.
-
IMAP4.readline() -
Читает одну строку с удалённого сервера. Этот метод можно переопределить.
-
IMAP4.recent() -
Запрашивает у сервера обновление. Если новых сообщений нет, возвращаемые данные равны
None; в противном случае возвращается значение ответаRECENT.
-
IMAP4.rename(oldmailbox, newmailbox) -
Переименовывает почтовую папку oldmailbox в newmailbox.
-
IMAP4.response(code) -
Возвращает данные для ответа code, если он получен, или
None. Возвращает указанный код вместо обычного типа.
-
IMAP4.search(charset, criterion[, ...]) -
Ищет в почтовой папке сообщения, соответствующие критериям. Параметр charset может иметь значение
None; в этом случае в запросе к серверу не указываетсяCHARSET. Протокол IMAP требует указать хотя бы один критерий; если сервер вернёт ошибку, будет возбуждено исключение. Значение charset должно бытьNone, если возможностьUTF8=ACCEPTбыла включена командойenable().Пример:
# M is a connected IMAP4 instance... typ, msgnums = M.search(None, 'FROM', '"LDJ"') # or: typ, msgnums = M.search(None, '(FROM "LDJ")')
-
IMAP4.select(mailbox='INBOX', readonly=False) -
Выбирает почтовую папку. Возвращаемые данные содержат число сообщений в mailbox (ответ
EXISTS). По умолчанию mailbox равен'INBOX'. Если установлен флаг readonly, изменять почтовую папку нельзя.
-
IMAP4.send(data) -
Отправляет
dataудалённому серверу. Этот метод можно переопределить.Вызывает событие аудита
imaplib.sendс аргументамиself,data.
-
IMAP4.setacl(mailbox, who, what) -
Устанавливает
ACLдля mailbox. Метод нестандартный, но поддерживается серверомCyrus.
-
IMAP4.setannotation(mailbox, entry, attribute[, ...]) -
Устанавливает
ANNOTATIONдля mailbox. Метод нестандартный, но поддерживается серверомCyrus.
-
IMAP4.setquota(root, limits) -
Устанавливает ограничения limits на ресурсы для корня
quotaroot. Этот метод входит в расширение IMAP4 QUOTA, определённое в rfc2087.
-
IMAP4.shutdown() -
Закрывает соединение, установленное методом
open. Этот метод неявно вызывается методомIMAP4.logout(). Этот метод можно переопределить.
-
IMAP4.socket() -
Возвращает экземпляр сокета, используемый для подключения к серверу.
-
IMAP4.sort(sort_criteria, charset, search_criterion[, ...]) -
Команда
sort— это вариант командыsearch, который дополнительно сортирует результаты. Возвращаемые данные содержат разделённый пробелами список номеров найденных сообщений.Команда sort принимает два аргумента перед аргументами search_criterion: список sort_criteria в круглых скобках и набор символов charset для поиска. Обратите внимание: в отличие от
search, аргумент charset для поиска обязателен. Существует также командаuid sort, соответствующаяsortтак же, какuid searchсоответствуетsearch. Командаsortсначала ищет в почтовой папке сообщения, соответствующие заданным критериям поиска, используя аргумент charset для интерпретации строк в критериях. Затем она возвращает номера найденных сообщений.Это команда расширения
IMAP4rev1.
-
IMAP4.starttls(ssl_context=None) -
Отправляет команду
STARTTLS. Аргумент ssl_context необязателен; он должен быть объектомssl.SSLContext. Это включает шифрование соединения IMAP. Рекомендации по безопасному использованию см. в разделе Рекомендации по безопасности.Добавлено в версии 3.2.
Изменено в версии 3.4: теперь метод поддерживает проверку имени узла с помощью
ssl.SSLContext.check_hostnameи индикацию имени сервера (см.ssl.HAS_SNI).
-
IMAP4.status(mailbox, names) -
Запрашивает указанные условия состояния для mailbox.
-
IMAP4.store(message_set, command, flag_list) -
Изменяет значения флагов сообщений в почтовой папке. Согласно разделу 6.4.6 RFC 2060, параметр command должен иметь значение «FLAGS», «+FLAGS» или «-FLAGS», при необходимости с суффиксом «.SILENT».
Например, чтобы установить флаг удаления для всех сообщений:
typ, data = M.search(None, 'ALL') for num in data[0].split(): M.store(num, '+FLAGS', '\\Deleted') M.expunge()
Примечание
Создание флагов, содержащих символ «]» (например, «[test]»), нарушает RFC 3501 (протокол IMAP). Однако imaplib исторически разрешает создавать такие метки, а популярные серверы IMAP, например Gmail, принимают и создают такие флаги. Такие метки создают и программы, не относящиеся к Python. Несмотря на нарушение RFC и требование к клиентам и серверам IMAP строго соблюдать стандарт, imaplib по-прежнему разрешает создавать такие метки для обратной совместимости; начиная с Python 3.6, библиотека также обрабатывает их, если они получены от сервера, поскольку это повышает совместимость в реальных условиях.
-
IMAP4.subscribe(mailbox) -
Подписывается на новую почтовую папку.
-
IMAP4.thread(threading_algorithm, charset, search_criterion[, ...]) -
Команда
thread— это вариант командыsearch, который группирует результаты в цепочки сообщений. Возвращаемые данные содержат разделённый пробелами список элементов цепочки.Элементы цепочки состоят из нуля или более номеров сообщений, разделённых пробелами и указывающих на последовательные отношения родительского и дочернего сообщений.
Команда thread принимает два аргумента перед аргументами search_criterion: алгоритм threading_algorithm и набор символов charset для поиска. Обратите внимание: в отличие от
search, аргумент charset для поиска обязателен. Существует также командаuid thread, соответствующаяthreadтак же, какuid searchсоответствуетsearch. Командаthreadсначала ищет в почтовой папке сообщения, соответствующие заданным критериям поиска, используя аргумент charset для интерпретации строк в критериях. Затем она возвращает найденные сообщения, сгруппированные в цепочки в соответствии с указанным алгоритмом.Это команда расширения
IMAP4rev1.
-
IMAP4.uid(command, arg[, ...]) -
Выполняет команду с аргументами для сообщений, заданных UID, а не номерами сообщений. Возвращает ответ, соответствующий команде. Необходимо указать хотя бы один аргумент; если аргументы не заданы, сервер вернёт ошибку и будет возбуждено исключение.
-
IMAP4.unsubscribe(mailbox) -
Отписывается от существующей почтовой папки.
-
IMAP4.unselect() -
imaplib.IMAP4.unselect()освобождает ресурсы сервера, связанные с выбранной почтовой папкой, и возвращает сервер в состояние после аутентификации. Эта команда выполняет те же действия, что иimaplib.IMAP4.close(), за исключением того, что сообщения не удаляются окончательно из текущей выбранной почтовой папки.Добавлено в версии 3.9.
-
IMAP4.xatom(name[, ...]) -
Позволяет использовать простые команды расширения, о которых сервер сообщил в ответе
CAPABILITY.
Для экземпляров IMAP4 определены следующие атрибуты:
-
IMAP4.PROTOCOL_VERSION -
Последняя версия протокола, поддерживаемая согласно ответу
CAPABILITYсервера.
-
IMAP4.debug -
Целочисленное значение, управляющее выводом отладочной информации. Начальное значение берётся из переменной модуля
Debug. При значениях больше трёх отслеживается выполнение каждой команды.
-
IMAP4.utf8_enabled -
Логическое значение, обычно равное
False, которое устанавливается вTrue, если для возможностиUTF8=ACCEPTуспешно выполнена командаenable().Добавлено в версии 3.5.
Пример IMAP4
Ниже приведён минимальный пример (без проверки ошибок), который открывает почтовую папку, извлекает все сообщения и выводит их:
import getpass, imaplib
M = imaplib.IMAP4(host='example.org')
M.login(getpass.getuser(), getpass.getpass())
M.select()
typ, data = M.search(None, 'ALL')
for num in data[0].split():
typ, data = M.fetch(num, '(RFC822)')
print('Message %s\n%s\n' % (num, data[0][1]))
M.close()
M.logout()
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/imaplib.html