В Gmail у меня есть куча помеченных сообщений.
Я хотел бы использовать IMAP-клиент для получения этих сообщений, но я не уверен, что такое поисковая заклинание.
c = imaplib.IMAP4_SSL('imap.gmail.com')
c.list()
('OK', [..., '(\HasNoChildren) "/" "GM"', ...])
c.search(???)
Я не нахожу много примеров для такого рода вещей.






Доступ к ярлыкам осуществляется точно так же, как к папкам IMAP., по данным Google.
@pyrony: Да, можно. Gmail этикетки отображается как IMAP почтовые ящики верхнего уровня. Я не уверен, почему они решили сделать это, а не раскрывать их как ключевые слова IMAP, но Gmail решил сделать именно это.
Я был очень удивлен, что imaplib не выполняет большую часть синтаксического анализа ответов. И кажется, что ответы были созданы так, чтобы их было сложно разобрать.
FWIW, чтобы ответить на мой вопрос: c.search (Нет, GM)
(Я понятия не имею, о чем идет речь в части '(\ HasNoChildren) "/"'.)
Это должно быть включено в исходный вопрос путем редактирования. (Это не ответ.)
@cdleary: Вы обратили внимание на часть c.search(None, 'GM'). Возможно, это неправильный ответ. Но это ответ.
Ой, пропустил. Прости за это.
Вы про c.select(None, 'GM').
imaplib намеренно представляет собой тонкую оболочку протокола IMAP, как я полагаю, для большей гибкости пользователя и большей способности адаптироваться к изменениям в спецификации IMAP. В результате он не предлагает никакой структуры для ваших поисковых запросов и требует, чтобы вы были знакомы с Спецификация IMAP.
Как вы увидите в разделе «6.4.4. Команда SEARCH», есть много вещей, которые вы можете указать для критерия поиска. Обратите внимание, что вам необходимо указать SELECT почтовый ящик (имя IMAP для папки), прежде чем вы сможете что-либо искать. (Насколько я понимаю, для одновременного поиска в нескольких папках требуется несколько подключений IMAP.) IMAP4.list поможет вам выяснить, каковы идентификаторы почтовых ящиков.
Также при формулировании строк, которые вы передаете в imaplib, полезен «9. Формальный синтаксис» из RFC, ссылка на который приведена выше.
r'(\HasNoChildren) "/"' - это флаг почтового ящика в корневом почтовом ящике /. См. «7.2.6. Ответ FLAGS».
Удачи!
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"')
Самый простой способ использовать imaplib с Gmail - использовать атрибут X-GM-RAW, как описано в Страница расширений Gmail Imap.
Процесс будет таким:
Сначала подключитесь к учетной записи с соответствующим адресом электронной почты и паролем:
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.
После этого вы можете получать каждое сообщение по идентификатору с помощью:
for id in data[0].split():
status, data = gmail.fetch(id, '(BODY[TEXT])')
Это неправда. Вы не можете использовать conn.select ("some-label-name").