Как выполнить 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"')
Ответ 3
Ярлыки доступны точно так же, как папки IMAP, согласно Google.
Ответ 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 "не имеет атрибута" список ""