2015-01-28 6 views
2

Я пишу скрипт python, который регулярно проверяет наличие нового электронного письма, соответствующего определенному поиску. Однако он никогда не показывает новые письма без повторного подключения.Python Imaplib: Получайте новые письма Gmail без повторного подключения

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login(user,passwd) 
mail.select("inbox") 
while True: 
    result, idData = mail.uid('search', query, "ALL") 
    processIDs(idData) 
    time.sleep(60) 

поиск находит все письма, которые соответствуют моему запросу во время входа, но он никогда не находит электронные письма, которые приходят в то время как он работает. Как только я остановлю скрипт и перезагрузим его, все электронные письма мгновенно появятся.

Если googled и просмотрел документы imaplib, но не нашел ничего полезного.

Как я могу получить новые сообщения электронной почты, чтобы не пересобираться на сервер imap?

Редактировать: Причина, по которой я хочу избежать повторного подключения, связана с ограничениями скорости gmail.

+0

Что делать, если вы перемещаете эти две строки 'mail.login (user, passwd)' 'mail.select (" inbox ")' внутри цикла while? это не идеальное решение, но может дать вам желаемые результаты, иначе вы можете искать, поддерживает ли эта библиотека режим потоковых данных? – ZdaR

+0

@Anmol_uppal Да, если я вхожу в систему каждый раз, когда это работает, но это то, чего я специально хочу избежать из-за ограничений скорости входа в Gmail. Я не знаю много о imap, если в потоковом режиме данных вы имеете в виду imap IDLE, тогда я так не думаю. Из того, что я читал, IDLE - это способ получить push-обновления для новых писем, но python imaplib этого не поддерживает. – Ecko

+0

попробуйте копировать только 'mail.select (" inbox ")' эта строка внутри цикла и посмотреть, работает ли это? Я не уверен в этом, но он должен работать, я думаю, – ZdaR

ответ

1

Ну, это своего рода подход к ударам и испытаниям, и, наконец, мы получаем решение, но не оптимальное, хотя взлом заключается в том, чтобы снова подключаться каждый раз после того, как скрипт просыпается от сна, чтобы извлечь почтовый ящик с начала, This можно легко сделать с помощью обновления страницы (как мы перезарядить в обычном браузере), поэтому она может выглядеть следующим образом:

mail = imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login(user,passwd) 
while True: 
    mail.select("inbox") 
    result, idData = mail.uid('search', query, "ALL") 
    processIDs(idData) 
    time.sleep(60) 
1

уронить time.sleep(60) и use idle() from this version of imaplib вместо этого. 29-минутный тайм-аут в порядке. Возможно, вам придется использовать более короткий тайм-аут, если у вас сломанный NAT-шлюз перед вашей сетью.

IMAP-команда IDLE указывает серверу, чтобы клиент знал, как только что-либо изменилось. Таким образом, вы запускаете IDLE, а затем, когда сервер что-то говорит, вы повторно запускаете свой поиск. Вы должны реагировать на изменения в течение секунды или двух.

0

Я знаю, что вы приняли ответ, но я думаю, что лучший подход, чем повторное подключение, заключается в выпуске NOOP command.

0

Вы можете отправить команду NOOP в цикле while или IDLE для обновления сеанса IMAP.

 Смежные вопросы

  • Нет связанных вопросов^_^