Python: Сбой непрочитанных писем в Gmail - PullRequest
4 голосов
/ 07 марта 2012
import imaplib, re
import os
import time
import socket

imap_host = 'imap.gmail.com'
mail = imaplib.IMAP4_SSL(imap_host)
mail.login("xxx@example.com", "sddd")

while True:
    try:
        print 'Connecting to Inbox..'
        mail.select("inbox") # connect to inbox.
        result, data = mail.uid('search', None, 'UNSEEN')
        uid_list = data[0].split()
        print len(uid_list), 'Unseen emails.'
        if len(uid_list) > 20:
         os.system('heroku restart --app xx-xx-203')
        time.sleep(30)
    except:
        print 'Error'
        imap_host = 'imap.gmail.com'
        mail = imaplib.IMAP4_SSL(imap_host)
        mail.login("xxx@example.com", "xxx")
        pass

Работает отлично, но иногда происходит сбой:

Restarting processes... done
Connecting to Inbox..
Error
Traceback (most recent call last):
  File "gmail_new9.py", line 24, in <module>
    mail.login("xxx@ccc.com", "ddddd")
  File "/usr/lib/python2.6/imaplib.py", line 498, in login
    typ, dat = self._simple_command('LOGIN', user, self._quote(password))
  File "/usr/lib/python2.6/imaplib.py", line 1060, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "/usr/lib/python2.6/imaplib.py", line 893, in _command_complete
    self._check_bye()
  File "/usr/lib/python2.6/imaplib.py", line 808, in _check_bye
    raise self.abort(bye[-1])
imaplib.abort: [UNAVAILABLE] Temporary System Error

Как я могу это исправить?

Ответы [ 2 ]

13 голосов
/ 18 марта 2012

Причиной сбоя вашего скрипта является то, что вызов mail.login () внутри блока «кроме» выдает исключение, которое никогда не перехватывается.

Документация для imaplib гласит, что при получении исключения imaplib.abort выследует просто повторить команду.

http://docs.python.org/library/imaplib

исключение IMAP4.abort Ошибки сервера IMAP4 вызывают это исключение.Это подкласс IMAP4.error.Обратите внимание, что закрытие экземпляра и создание нового экземпляра обычно позволяет восстановить данные из этого исключения.

Также

>>> help('imaplib')

говорит то же самое:

Исключения «abort» подразумевают, что соединение должно быть сброшено, а команда повторена.

Вот как это можно исправить:

import imaplib, re
import os
import time
import socket

def connect(retries=5, delay=3):
    while True:
        try:
            imap_host = 'imap.gmail.com'
            mail = imaplib.IMAP4_SSL(imap_host)
            mail.login("xxx@example.com", "sddd")
            return mail
        except imaplib.IMAP4_SSL.abort:
            if retries > 0:
                retries -= 1
                time.sleep(delay)
            else:
                raise

mail = connect()
while True:
    try:
        print 'Connecting to Inbox..'
        mail.select("inbox") # connect to inbox.
        result, data = mail.uid('search', None, 'UNSEEN')
        uid_list = data[0].split()
        print len(uid_list), 'Unseen emails.'
        if len(uid_list) > 20:
         os.system('heroku restart --app xx-xx-203')
        time.sleep(30)
    except:
        print 'Error'
        mail = connect()
1 голос
/ 15 марта 2012

Где находится номер порта для imap? Разве это не требуется? Я использовал приведенный ниже код, и он работает. Проверьте, работает ли он у вас тоже -

import imaplib

gmail = imaplib.IMAP4_SSL('imap.gmail.com',993)
gmail.login('username','password')
gmail.select("inbox")
result, data = gmail.uid('search', None, 'UNSEEN')

Вы также можете попробовать Gmail.py . Я попытался использовать этот простой скрипт, который абстрагирует простые вызовы imap.

from gmail import *

gmail = GmailClient()
gmail.login('username','password')
unreadMail = gmail.get_inbox_conversations(is_unread=True)
print unreadMail

Будь в курсе! Gmail IMAP имеет известных проблем с клиентами, запрашивающими аутентификацию "слишком часто". Помимо прочего, это может пометить вашу учетную запись, чтобы она требовала передать CAPTCHA для продолжения синхронизации. Зайдите сюда , чтобы попытаться разблокировать, а затем повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...