imaplib — Клиент протокола IMAP4
Исходный код: Lib/imaplib.py
Этот модуль определяет три класса, IMAP4, IMAP4_SSL и IMAP4_stream, которые инкапсулируют соединение с сервером IMAP4 и реализуют большой подмножество протокола IMAP4rev1 клиент, как определено в RFC 2060. Он обратной совместим с серверами IMAP4 (RFC 1730), но обратите внимание, что команда STATUS не поддерживается в IMAP4.
Модуль imaplib предоставляет три класса, IMAP4 является базовым классом:
-
class imaplib.IMAP4(host='', port=IMAP4_PORT) -
Этот класс реализует фактический протокол IMAP4. Соединение создаётся и версия протокола (IMAP4 или IMAP4rev1) определяется при инициализации экземпляра. Если host не указан, используется
''(локальный хост). Если port опущен, используется стандартный порт IMAP4 (143).Класс
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.
Три исключения определены как атрибуты класса IMAP4:
-
exception IMAP4.error -
Исключение, генерируемое при любых ошибках. Причина исключения передаётся конструктору в виде строки.
-
exception IMAP4.abort -
Ошибки сервера IMAP4 вызывают генерацию этого исключения. Это подкласс
IMAP4.error. Обратите внимание, что закрытие экземпляра и создание нового обычно позволяют восстановиться после этого исключения.
-
exception IMAP4.readonly -
Это исключение генерируется, когда статус записываемого почтового ящика изменяется сервером. Это подкласс
IMAP4.error. Другой клиент теперь имеет право на запись, и почтовый ящик необходимо снова открыть, чтобы получить право на запись.
Также есть подкласс для защищённых соединений:
-
class imaplib.IMAP4_SSL(host='', port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=None) -
Это подкласс, унаследованный от
IMAP4, который подключается через защищённое SSL-сокетное соединение (для использования этого класса вам нужен модуль сокетов, скомпилированный с поддержкой SSL). Если host не указан, используется''(локальный хост). Если port опущен, используется стандартный порт IMAP4 через SSL (993). ssl_context — объектssl.SSLContext, который позволяет объединить параметры конфигурации SSL, сертификаты и закрытые ключи в единую (возможно, долгоживущую) структуру. Для ознакомления с лучшими практиками, обратитесь к разделам Общие принципы безопасности.keyfile и certfile — устаревший альтернативный вариант ssl_context — они могут указывать на файлы закрытого ключа и цепочки сертификатов в формате PEM для SSL-соединения. Обратите внимание, что параметры keyfile/certfile взаимно исключают ssl_context; если keyfile/certfile указаны вместе с ssl_context, возникает исключение
ValueError.Изменено в версии 3.3: Добавлен параметр ssl_context.
Изменено в версии 3.4: Класс теперь поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostnameи Server Name Indication (см.ssl.HAS_SNI).Устарело начиная с версии 3.6: Параметры keyfile и certfile устарели в пользу ssl_context. Вместо них используйте
ssl.SSLContext.load_cert_chain(), или позвольтеssl.create_default_context()выбрать доверенные сертификаты CA системы.
Второй подкласс позволяет создавать соединения, созданные дочерним процессом:
-
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 может быть числом (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, либо кортежем. Если это кортеж, то первая часть — это заголовок ответа, а вторая часть содержит данные (т.е. значение ‘literal’).
Параметр 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) -
Удалить списки управления доступом (удалить все права), установленные для кого в почтовом ящике.
-
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) -
Получить использование ресурсов и лимиты для root
quota. Этот метод является частью расширения 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.
-
IMAP4.logout() -
Закрыть соединение с сервером. Возвращает ответ сервера
BYE.Изменено в версии 3.8: Метод больше не игнорирует молча произвольные исключения.
-
IMAP4.lsub(directory='""', pattern='*') -
Список подписанных имен почтовых ящиков в каталоге, соответствующих шаблону. directory по умолчанию — каталог верхнего уровня, а pattern по умолчанию соответствует любому почтовому ящику. Возвращенные данные представляют собой кортежи конверта части сообщения и данных.
-
IMAP4.myrights(mailbox) -
Показать мои списки управления доступом для почтового ящика (т.е. права, которые я имею на почтовый ящик).
-
IMAP4.namespace() -
Возвращает пространства имен IMAP, как определено в RFC 2342.
-
IMAP4.noop() -
Отправить
NOOPна сервер.
-
IMAP4.open(host, port) -
Открывает сокет к port на host. Этот метод неявно вызывается конструктором
IMAP4. Объекты соединений, созданные этим методом, будут использоваться в методахIMAP4.read(),IMAP4.readline(),IMAP4.send()иIMAP4.shutdown(). Вы можете переопределить этот метод.Вызывает событие аудита auditing event
imaplib.openс аргументамиself,host,port.
-
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 для интерпретации строк в критериях поиска. Затем она возвращает номера соответствующих сообщений.Это расширение команды
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) -
Изменяет состояния флагов сообщений в почтовом ящике. 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; алгоритм ветвления и набор charset для поиска. В отличие от
search, аргумент charset для поиска обязателен. Также существует командаuid thread, которая соответствует командеthread, так же какuid searchсоответствуетsearch. Командаthreadсначала ищет в почтовом ящике сообщения, соответствующие заданным критериям поиска, используя аргумент charset для интерпретации строк в критериях поиска. Затем она возвращает сообщения, сгруппированные по ветвям согласно указанному алгоритму.Это расширение команды
IMAP4rev1.
-
IMAP4.uid(command, arg[, ...]) -
Выполнение командных аргументов с идентификацией сообщений по UID, а не по номеру. Возвращает ответ, соответствующий команде. Необходимо указать хотя бы один аргумент; если их не указано, сервер вернёт ошибку, и будет возбуждено исключение.
-
IMAP4.unsubscribe(mailbox) -
Отмена подписки на старый почтовый ящик.
-
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()
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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/imaplib.html