imaplib — Клиент протокола IMAP4
Исходный код: Lib/imaplib.py
Этот модуль определяет три класса, IMAP4, IMAP4_SSL и IMAP4_stream, которые инкапсулируют соединение с сервером IMAP4 и реализуют большой подмножество протокола IMAP4rev1 клиента, как определено в RFC 2060. Он обратной совместим с серверами IMAP4 (RFC 1730), но обратите внимание, что команда STATUS не поддерживается в IMAP4.
Доступность: не Emscripten, не WASI.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. См. Платформы 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 сокету (для использования этого класса вам нужен модуль сокетов, скомпилированный с поддержкой 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) -
Разбирает строку IMAP4
INTERNALDATEи возвращает соответствующее местное время. Результат — кортежtime.struct_timeилиNone, если строка имеет неправильный формат.
-
imaplib.Int2AP(num) -
Преобразует целое число в представление типа байты, используя символы из набора [
A..P].
-
imaplib.ParseFlags(flagstr) -
Преобразует ответ IMAP4
FLAGSв кортеж отдельных флагов.
-
imaplib.Time2Internaldate(date_time) -
Преобразует date_time в представление IMAP4
INTERNALDATE. Результат — строка в формате:"DD-Mmm-YYYY HH:MM:SS +HHMM"(включая двойные кавычки). Аргумент date_time может быть числом (целым или плавающей точкой), представляющим секунды с эпохи (как возвращаетtime.time()), 9-кортежем, представляющим местное время, экземпляромtime.struct_time(как возвращаетtime.localtime()), осознанным экземпляромdatetime.datetimeили строкой в двойных кавычках. В последнем случае предполагается, что она уже в правильном формате.
Обратите внимание, что номера сообщений IMAP4 изменяются при изменении почтового ящика; в частности, после выполнения команды EXPUNGE удаления перечисленные оставшиеся сообщения переиндексируются. Поэтому настоятельно рекомендуется использовать UIDs с командой 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) -
Получить
quotaиспользование и ограничения ресурсов root. Этот метод является частью расширения IMAP4 QUOTA, определенного в rfc2087.
-
IMAP4.getquotaroot(mailbox) -
Получить список
quotarootsдля указанной папки mailbox. Этот метод является частью расширения IMAP4 QUOTA, определенного в rfc2087.
-
IMAP4.list([directory[, pattern]]) -
Вывести имена папок в каталоге, соответствующие шаблону pattern. directory по умолчанию — верхнеуровневая папка почты, а pattern по умолчанию соответствует всему. Возвращаемые данные содержат список
LISTответов.
-
IMAP4.login(user, password) -
Идентифицировать клиента с помощью пароля в формате открытого текста. password будет заключён в кавычки.
-
IMAP4.login_cram_md5(user, password) -
Принудительное использование аутентификации
CRAM-MD5при идентификации клиента для защиты пароля. Будет работать только если ответ сервераCAPABILITYвключает фразуAUTH=CRAM-MD5.
-
IMAP4.logout() -
Закрыть соединение с сервером. Возвращает ответ сервера
BYE.Изменено в версии 3.8: Метод больше не игнорирует произвольные исключения.
-
IMAP4.lsub(directory='""', pattern='*') -
Вывести имена подписок папок в каталоге, соответствующие шаблону 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) -
Установка
quotaограничений ресурса root. Этот метод является частью расширения 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 для интерпретации строк в критериях поиска. Затем она возвращает номера соответствующих сообщений.Это расширенная команда расширения.
-
IMAP4.starttls(ssl_context=None) -
Отправка команды
STARTTLS. Аргумент ssl_context является необязательным и должен быть объектомssl.SSLContext. Это позволит включить шифрование в соединении IMAP. Для получения рекомендаций по лучшим практикам см. Рекомендации по безопасности.Добавлен в версии 3.2.
Изменено в версии 3.4: Теперь метод поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostnameи Server Name Indication (см.ssl.HAS_SNI).
-
IMAP4.status(mailbox, names) -
Запрос условий состояния с именем для mailbox.
-
IMAP4.store(message_set, command, flag_list) -
Изменяет расположение флагов для сообщений в почтовом ящике. command определяется разделом 6.4.6 RFC 2060 как одно из «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 для интерпретации строк в критериях поиска. Затем она возвращает сообщения, сгруппированные в потоки в соответствии со специфицированным алгоритмом потоков.Это расширенная команда расширения.
-
IMAP4.uid(command, arg[, ...]) -
Выполнение команды args с сообщениями, идентифицированными по 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, если командаenable()успешно выполнена для возможностиUTF8=ACCEPT.Добавлен в версии 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/imaplib.html