2011-09-27 11 views
5

Sto programmando un'applet python che controlla il conteggio non letto delle caselle di posta elettronica per il mio posto di lavoro e ho riscontrato un errore EOF quando tento di utilizzare qualsiasi metodo imaplib dopo che l'applet rimane inattivo per circa 10 minuti. Tutto funziona bene fino a quando l'applet è stata in vita per più di 10 minuti.Errore EOF in Imaplib

Questo è il codice pertinente per l'oggetto imaplib.

conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 

def loginIMAP (imapObj): 
    # Login to Helpdesk Google Apps Email account using encryption 
    imapObj.login(base64.b64decode("usrEncryption"), base64.b64decode("pwdEncrytion")) 
    return(getUnread(imapObj)) 

def closeIMAP (imapObj): 
    imapObj.logout() 


def getUnread (imapObj): 
    # Check connection status OK 
    try: 
     uc0 = int(re.search("UNSEEN (\d+)", imapObj.status("INBOX", "(UNSEEN)")[1][0]).group(1)) 
     uc1 = int(re.search("UNSEEN (\d+)", imapObj.status("A box 1", "(UNSEEN)")[1][0]).group(1)) 
     uc2 = int(re.search("UNSEEN (\d+)", imapObj.status("A box 2", "(UNSEEN)")[1][0]).group(1)) 
    except: 
     print "Shit's all disconnected n stuff" 
     loginIMAP(conn) 

    unreadCount = [(uc0-(uc1+uc2)),uc1,uc2] 
    if unreadCount[0] < 0: 
     unreadCount[0]=0 
    return unreadCount 

usrEncryption e pwdEncryption sono solo io mascherare i u/p così i nostri account di accesso di helpdesk non sono tutte pubbliche.

Quando provo e chiamo la getUnread(conn) dopo aver l'applet aperto per più di dieci minues ottengo il seguente output:

Traceback (most recent call last): 
    File "C:\Jamin'sApps\Development\Projects\Check HD Box\checkHDBox.py", line 255, in OnRefresh 
    unread = getUnread(conn) 
    File "C:\Jamin'sApps\Development\Projects\Check HD Box\checkHDBox.py", line 119, in getUnread 
    uc0 = int(re.search("UNSEEN (\d+)", imapObj.status("INBOX", "(UNSEEN)")[1][0]).group(1)) 
    File "C:\Jamin'sApps\Development\Python\python2.7.2\lib\imaplib.py", line 710, in status 
    typ, dat = self._simple_command(name, mailbox, names) 
    File "C:\Jamin'sApps\Development\Python\python2.7.2\lib\imaplib.py", line 1070, in _simple_command 
    return self._command_complete(name, self._command(name, *args)) 
    File "C:\Jamin'sApps\Development\Python\python2.7.2\lib\imaplib.py", line 899, in _command_complete 
    raise self.abort('command: %s => %s' % (name, val)) 
imaplib.abort: command: STATUS => socket error: EOF 
Traceback (most recent call last): 
    File "C:\Jamin'sApps\Development\Projects\Check HD Box\checkHDBox.py", line 255, in OnRefresh 
    unread = getUnread(conn) 
    File "C:\Jamin'sApps\Development\Projects\Check HD Box\checkHDBox.py", line 119, in getUnread 
    uc0 = int(re.search("UNSEEN (\d+)", imapObj.status("INBOX", "(UNSEEN)")[1][0]).group(1)) 
    File "C:\Jamin'sApps\Development\Python\python2.7.2\lib\imaplib.py", line 710, in status 
    typ, dat = self._simple_command(name, mailbox, names) 
    File "C:\Jamin'sApps\Development\Python\python2.7.2\lib\imaplib.py", line 1070, in _simple_command 
    return self._command_complete(name, self._command(name, *args)) 
    File "C:\Jamin'sApps\Development\Python\python2.7.2\lib\imaplib.py", line 859, in _command 
    raise self.abort('socket error: %s' % val) 
imaplib.abort: socket error: [Errno 10053] An established connection was aborted by the software in your host machine 

Il doesnt blocco di eccezioni sembrano davvero a lavorare per il problema, che è quello che ho davvero bisogno di aiuto con. Quindi, come mantenere questa connessione viva e vegeta?

Grazie.

+0

Suona come se fosse scaduto. Ma di default non esiste un timeout impostato su 'socket' in imaplib, quindi forse è Gmail a farlo? Ottieni risultati diversi con un server SMTP diverso? – Dave

risposta

7

È necessario riconnettersi da ri-inizializzare classe, non solo il login, utilizzando

conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 

Un esempio completo:

while True: 
    imap = imaplib.IMAP4_SSL(SERVER) 
    r, d = imap.login(ACCOUNT, PASSWORD) 
    assert r == 'OK', 'login failed' 
    try: 
     # do things with imap 
    except imap.abort, e: 
     continue 
    imap.logout() 
    break 
+0

Grazie per la risposta. Qual è la 'e' nell'eccezione? –

+0

'e' è solo per rappresentare un'istanza di eccezione, che puoi fare' log.error (str (e)) 'nel blocco' except' – cxase

+0

Cool, grazie. Ancora imparando. –

3

sono riuscito ad integrare cxase di in una classe IMAP personalizzata che si è preso cura di tutti i miei problemi Ecco il codice per chiunque stia leggendo questo:

class IMAPConnection(): 

    def __init__(self): 
     self.imap = imaplib.IMAP4_SSL("imap.gmail.com", 993) 

    def login (self): 
     # Login to Helpdesk Google Apps Email account using encryption 
     self.imap.login(base64.b64decode("username"), base64.b64decode("password")) 

    def logout (self): 
     self.imap.logout() 

    def getUnread (self): 
     # Check connection status OK 
     try: 
      uc0 = int(re.search("UNSEEN (\d+)", self.imap.status("INBOX", "(UNSEEN)")[1][0]).group(1)) 
      uc1 = int(re.search("UNSEEN (\d+)", self.imap.status("A box 1", "(UNSEEN)")[1][0]).group(1)) 
      uc2 = int(re.search("UNSEEN (\d+)", self.imap.status("A box 2", "(UNSEEN)")[1][0]).group(1)) 
     except imap.abort: 

      # Reinstantiate connection and login 
      self.imap = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
      self.login() 

      # Retry unread update block 
      uc0 = int(re.search("UNSEEN (\d+)", self.imap.status("INBOX", "(UNSEEN)")[1][0]).group(1)) 
      uc1 = int(re.search("UNSEEN (\d+)", self.imap.status("A box 1", "(UNSEEN)")[1][0]).group(1)) 
      uc2 = int(re.search("UNSEEN (\d+)", self.imap.status("A box 2", "(UNSEEN)")[1][0]).group(1)) 

     # Is the Helpdesk Negative? Hell no it's not. 
     unreadCount = [(uc0-(uc1+uc2)),uc1,uc2] 
     if unreadCount[0] < 0: 
      unreadCount[0]=0 
     return unreadCount