2011-09-27 16 views
5

Estoy programando un applet de python que observa el recuento no leído de los buzones de correo electrónico de mi lugar de trabajo y me encontré con un error EOF cuando trato de usar cualquier método imaplib después de que el applet permanece inactivo durante aproximadamente 10 minutos. Todo funciona bien hasta que el applet ha estado activo durante más de 10 minutos.EOF Error en Imaplib

Aquí está el código relevante para el objeto 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 y pwdEncryption son sólo yo enmascarar el T/P para que nuestros datos de acceso de unidad de asistencia no son públicas.

Cuando intento y llamar a la getUnread(conn) después de tener el applet abierta durante más de diez minues me sale el siguiente resultado:

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 

el imposible de bloque de excepción parecen realmente a trabajar para el problema, que es lo que yo realmente necesito ayuda con. Entonces, ¿cómo mantengo esta conexión viva y coleando?

Gracias.

+0

Suena como si fuera tiempo de espera. Pero de forma predeterminada, no hay tiempo de espera establecido en el 'socket' en imaplib, entonces ¿quizás sea Gmail quien lo está haciendo? ¿Obtienes diferentes resultados con un servidor SMTP diferente? – Dave

Respuesta

7

deberá volver a conectar por clase reinicializar, no sólo inicio de sesión, utilizando

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

Un ejemplo 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

Gracias por la respuesta. ¿Para qué es la 'e' en la excepción? –

+0

'e' es solo para representar una instancia de excepción, que puede hacer' log.error (str (e)) 'en el bloque' except' – cxase

+0

Cool, gracias. Aún aprendiendo. –

3

logré integrar de cxase en una clase IMAP personalizado que se hizo cargo de todos mis problemas Aquí está el código para cualquiera que lea esto:

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