Как мне выполнить поиск IMAP в Python (используя Gmail и imaplib)? - PullRequest
10 голосов
/ 07 октября 2008

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

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

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

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

Ответы [ 5 ]

9 голосов
/ 07 января 2009

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

.

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

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

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

Удачи!

8 голосов
/ 23 июня 2010
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"')
5 голосов
/ 07 октября 2008
1 голос
/ 26 апреля 2016

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

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

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

c = imaplib.IMAP4_SSL('imap.gmail.com', 993)
email = 'eggs@spam'
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])')
0 голосов
/ 09 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...