Поиск в Gmail с использованием imaplib с использованием двойных кавычек - как избежать ошибки команды поиска - PullRequest
0 голосов
/ 05 июня 2019

Мне нужно найти в чьей-то учетной записи Gmail конкретную фразу "foo bar". Если я выполняю поиск в строке foo без двойных кавычек, я получаю> 125 000 электронных писем, а при поиске в двойных кавычках (из браузера) я получаю 180 релевантных электронных писем, которые я ищу. Однако метод поиска imaplib не позволит мне использовать двойные кавычки. Что я могу с этим поделать?

Это то, что я уже пробовал:

import imaplib
mail = imaplib.IMAP4_SSL(SMTP_SERVER)
mail.login(USERNAME,PASSWORD)
mail.select(mail_box)
Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY "foo bar"'))

^^ работает, но возвращает> 125 000 электронных писем, в основном не относящихся к делу - что-нибудь с foo и bar

Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY ""foo bar""'))
Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY "\"foo bar\""'))
Type, data = mail.search(None, ('Since 01-Jan-2016'), ('BODY """foo bar"""'))

^^^ все вышеперечисленное выдает следующую ошибку: «error: ошибка команды SEARCH: BAD [b'Could not parse command ']»

Любые идеи будут высоко оценены.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Как предположил Макс выше, это то, что сработало:

import imaplib
mail = imaplib.IMAP4_SSL(SMTP_SERVER)
mail.login(USERNAME,PASSWORD)
mail.select(mail_box)

Type, data = mail.uid('search', None, ('Since 01-Jan-2016'), 'X-GM-RAW', r'"\"foo bar\""')

Обратите внимание, что если вы используете поиск mail.uid (), вам также необходимо обновить вызов fetch до ...

mail.uid('fetch', ID, '(RFC822)')
0 голосов
/ 07 июня 2019

Это должно работать:

mail.search(None, r'BODY "\"Security Alert\""')

r, чтобы превратить ее в необработанную строку, чтобы обратный слеш не интерпретировался Python. Затем обратный слеш отправляется на сервер и интерпретируется правильно.

Вы должны иметь возможность адаптировать этот формат для вашего использования.

Примечание: чтобы увидеть, что отправляется, временно установите большое значение в mail.debug, например 4. Это показывает трафик. Увидев это, я увидел, что на самом деле цитату не удалось избежать (потому что Python рассматривал возврат как отступление).

mail.debug = 4
...