Как выполнить IMAP-поиск в Python (используя Gmail и imaplib)?

В Gmail у меня есть куча помеченных сообщений.

Я хотел бы использовать IMAP-клиент для получения этих сообщений, но я не уверен, что такое заклинание поиска.

c = imaplib.IMAP4_SSL('imap.gmail.com')
c.list()
('OK', [..., '(\\HasNoChildren) "/" "GM"', ...])
c.search(???)

Я не нахожу много примеров для такого рода вещей.

Ответ 1

imaplib намеренно представляет собой тонкую оболочку вокруг протокола IMAP, я предполагаю, что это обеспечивает большую степень гибкости пользователя и большую способность адаптироваться к изменениям в спецификации IMAP. В результате он не предлагает какой-либо структуры для ваших поисковых запросов и требует, чтобы вы были знакомы с спецификацией IMAP.

Как вы увидите в разделе "6.4.4 Команда ПОИСК", есть много вещей, которые вы можете указать для критерия поиска. Обратите внимание, что перед поиском чего-либо вы должны SELECT почтовый ящик (имя IMAP для папки). (Для поиска нескольких папок одновременно требуется несколько IMAP-соединений, как я понимаю). IMAP4.list поможет вам разобраться, что такое идентификаторы почтовых ящиков.

Также полезно при формулировании строк, которые вы передаете на imaplib, является "9. Формальный синтаксис" из RFC, связанного с выше.

r'(\HasNoChildren) "/"' - это флаг почтового ящика в корневом почтовом ящике /. См. "7.2.6. Ответ FLAGS".

Удачи!

Ответ 2

import imaplib 
obj = imaplib.IMAP4_SSL('imap.gmail.com', 993)
obj.login('username', 'password')
obj.select('**label name**') # <-- the label in which u want to search message
obj.search(None, 'FROM', '"LDJ"')

Ответ 4

Самый простой способ использования imaplib с Gmail - использовать атрибут X-GM-RAW, как описано в странице Gmail Imap Extensions.

Процесс будет таким:

Сначала подключитесь к учетной записи с соответствующим адресом электронной почты и паролем:

c = imaplib.IMAP4_SSL('imap.gmail.com', 993)
email = '[email protected]'
password = 'spamspamspam'
c.login(email, password)

Затем подключитесь к одной из папок/меток:

c.select("INBOX")

При необходимости вы можете перечислить все доступные папки/метки с помощью c.list().

Наконец, используйте метод поиска:

gmail_search = "has:attachment eggs OR spam"
status, data = c.search(None, 'X-GM-RAW', gmail_search)

В gmail_search вы можете использовать тот же синтаксис поиска, который использовался в расширенный поиск gmail.

Команда поиска вернет статус команды и идентификаторы всех сообщений, соответствующих вашему gmail_search.

После этого вы можете получить каждое сообщение по id с помощью

for id in data[0].split():
    status, data = gmail.fetch(id, '(BODY[TEXT])')

Ответ 5

Я был очень удивлен тем, что imaplib не выполняет большой парсинг ответов. И кажется, что ответы были обработаны, чтобы их было трудно разобрать.

FWIW, чтобы ответить на мой собственный вопрос:   c.search(Нет, "GM" )

(я понятия не имею, что это за часть '(\ HasNoChildren) "/" '.)

Ответ 6

Когда я использую c.select() или c.list, я получаю следующие ошибки: "AttributeError: объект" SMTP_SSL "не имеет атрибута" список ""