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 (для использования этого класса вам нужен модуль сокетов, скомпилированный с поддержкой 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 может быть числом (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. Этот метод является частью расширения 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, timeout=None) -
Открывает сокет на port по адресу host. Необязательный параметр timeout задает время ожидания в секундах для попытки подключения. Если время ожидания не указано или равно
None, используется глобальное время ожидания сокета по умолчанию. Обратите внимание, что если параметр timeout установлен в ноль, он вызоветValueError, чтобы отклонить создание неблокирующего сокета. Этот метод неявно вызывается конструкторомIMAP4. Объекты соединения, созданные этим методом, будут использоваться в методахIMAP4.read(),IMAP4.readline(),IMAP4.send()иIMAP4.shutdown(). Вы можете переопределить этот метод.Вызывает событие аудита auditing event
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 ограничения limits. Этот метод является частью расширения 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и 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 для интерпретации строк в критериях поиска. Затем она возвращает соответствующие сообщения, сгруппированные в потоки в соответствии с заданным алгоритмом.Это расширение команды
IMAP4rev1.
-
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.13/library/imaplib.html