imaplib — клиент протокола IMAP4
Исходный код: Lib/imaplib.py
Этот модуль определяет три класса: IMAP4, IMAP4_SSL и IMAP4_stream, которые инкапсулируют подключение к серверу IMAP4 и реализуют большую часть клиентского протокола IMAP4rev1, определённого в RFC 3501. Он обратно совместим с серверами 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. При таком использовании командаLOGOUTIMAP4 автоматически отправляется при выходе из инструкции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, сертификаты и закрытые ключи в одну (потенциально долгоживущую) структуру. Рекомендации по обеспечению безопасности см. в разделе Рекомендации по безопасности.Примечание
При использовании ssl_context по умолчанию подключение шифруется, но сертификат сервера и имя хоста не проверяются. Чтобы выполнять их проверку, передайте контекст, созданный с помощью
ssl.create_default_context().Необязательный параметр timeout задаёт время ожидания в секундах для попытки подключения. Если параметр timeout не задан или равен
None, используется глобальное значение времени ожидания сокета по умолчанию.Изменено в версии 3.3: Добавлен параметр ssl_context.
Изменено в версии 3.4: Теперь класс поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostnameи индикацию имени сервера (см.ssl.HAS_SNI).Изменено в версии 3.9: Добавлен необязательный параметр timeout.
Изменено в версии 3.12: Устаревшие параметры keyfile и certfile удалены.
Второй подкласс позволяет устанавливать подключения, созданные дочерним процессом:
-
class imaplib.IMAP4_stream(command) -
Это подкласс
IMAP4, подключающийся к файловым дескрипторамstdin/stdout, созданным передачей command функцииsubprocess.Popen().
Определены следующие вспомогательные функции:
-
imaplib.Internaldate2tuple(resp) -
Разбирает объект, подобный bytes, содержащий ответ
INTERNALDATEIMAP4, и возвращает соответствующее местное время. Возвращаемое значение — кортежtime.struct_timeилиNone, если входные данные имеют неверный формат.
-
imaplib.Int2AP(num) -
Преобразует целое число в представление в виде байтов, используя символы из набора [
A..P].
-
imaplib.ParseFlags(resp) -
Преобразует объект, подобный bytes, содержащий ответ
FLAGSIMAP4, в кортеж отдельных флагов типаbytes. Если входные данные имеют неверный формат, возвращается пустой кортеж.
-
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 в почтовый ящик с указанным именем.
flags может быть
Noneили строкой токенов флагов IMAP. Несколько флагов разделяются пробелами, напримерr'\Seen \Answered'. Если flags еще не заключен в круглые скобки, они добавляются автоматически.
-
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).Добавлено в версии 3.5: сам метод
enable()и поддержка 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.idle(duration=None) -
Возвращает
Idler: итерируемый менеджер контекста, реализующий команду IMAP4IDLE, определенную в RFC 2177.Возвращенный объект отправляет команду
IDLEпри активации операторомwith, выдает не помеченные тегами ответы IMAP через протокол итератора и отправляетDONEпри выходе из контекста.Все не помеченные тегами ответы, поступившие после отправки команды
IDLE(включая ответы, полученные до подтверждения команды сервером), будут доступны при итерации. Любые оставшиеся ответы (те, по которым не выполнялась итерация в контекстеwith) можно получить обычным способом после завершенияIDLEс помощьюIMAP4.response().Ответы представлены в виде кортежей
(type, [data, ...]), как описано в разделе Объекты IMAP4.Аргумент duration задает максимальную продолжительность ожидания (в секундах), по истечении которой текущая итерация остановится. Это может быть
intилиfloat, либоNoneдля отсутствия ограничения по времени. Вызывающим сторонам, которые хотят избежать тайм-аутов бездействия на серверах, использующих такие ограничения, следует задавать значение не более 29 минут (1740 секунд). Требуется подключение через сокет; для соединенийIMAP4_streamзначение duration должно бытьNone.>>> with M.idle(duration=29 * 60) as idler: ... for typ, data in idler: ... print(typ, data) ... EXISTS [b'1'] RECENT [b'1']
-
Idler.burst(interval=0.1) -
Выдает группу ответов, поступивших с интервалом не более interval секунд (значение задается как
intилиfloat).Этот генератор служит альтернативой получению ответов по одному и предназначен для эффективной пакетной обработки. Он получает следующий ответ вместе со всеми последующими ответами, которые доступны немедленно. (Например, быструю последовательность ответов
EXPUNGEпосле массового удаления.)Требуется подключение через сокет; не работает для соединений
IMAP4_stream.>>> with M.idle() as idler: ... # get a response and any others following by < 0.1 seconds ... batch = list(idler.burst()) ... print(f'processing {len(batch)} responses...') ... print(batch) ... processing 3 responses... [('EXPUNGE', [b'2']), ('EXPUNGE', [b'1']), ('RECENT', [b'0'])]Совет
Максимальная продолжительность контекста
IDLE, переданная вIMAP4.idle(), учитывается при ожидании первого ответа в группе. Поэтому истекшийIdlerприведет к немедленному завершению генератора без выдачи каких-либо данных. Если вы используете его в цикле, учитывайте это.
Примечание
Итератор, возвращенный
IMAP4.idle(), можно использовать только внутри оператораwith. До или после этого контекста незапрошенные ответы собираются внутри программы при каждом завершении команды; их можно получить с помощьюIMAP4.response().Примечание
Имя и структура класса
Idlerявляются внутренними интерфейсами и могут измениться. Вызывающий код может полагаться на стабильность управления контекстом, итерации и открытого метода, но не должен создавать подклассы, экземпляры, сравнивать класс или иным образом обращаться к нему напрямую.Добавлено в версии 3.14.
-
-
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.14: если поддержка 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) -
Устанавливает ограничения на использование ресурсов для
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. Рекомендации по обеспечению безопасности см. в разделе Рекомендации по безопасности.Примечание
При использовании ssl_context по умолчанию соединение шифруется, но сертификат сервера и имя узла не проверяются. Чтобы проверять их, передайте контекст, созданный с помощью
ssl.create_default_context().Добавлено в версии 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 3501, 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, если команда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()
Примечание
Ответ FETCH может содержать дополнительные или незапрошенные данные (см. RFC 3501, раздел 7.4.2), поэтому в рабочем коде следует проверять весь ответ, а не полагаться только на data[0][1].
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/imaplib.html