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

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

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

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
11
0
15 616
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Доступ к ярлыкам осуществляется точно так же, как к папкам IMAP., по данным Google.

Это неправда. Вы не можете использовать conn.select ("some-label-name").

Jay Taylor 26.02.2011 02:43

@pyrony: Да, можно. Gmail этикетки отображается как IMAP почтовые ящики верхнего уровня. Я не уверен, почему они решили сделать это, а не раскрывать их как ключевые слова IMAP, но Gmail решил сделать именно это.

dkarp 02.03.2011 02:33

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

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

(Я понятия не имею, о чем идет речь в части '(\ HasNoChildren) "/"'.)

Это должно быть включено в исходный вопрос путем редактирования. (Это не ответ.)

cdleary 07.01.2009 22:35

@cdleary: Вы обратили внимание на часть c.search(None, 'GM'). Возможно, это неправильный ответ. Но это ответ.

jfs 07.01.2009 22:44

Ой, пропустил. Прости за это.

cdleary 20.01.2009 08:03

Вы про c.select(None, 'GM').

dkarp 02.03.2011 02:35
Ответ принят как подходящий

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])')

Другие вопросы по теме