2011-09-27 237 views
5

我正在編程一個python小程序,該小程序監視我工作區中電子郵件框的未讀計數,並在Applet閒置約10分鐘後嘗試使用任何imaplib方法時遇到EOF錯誤。一切正常,直到applet已經存活超過10分鐘。Imaplib中的EOF錯誤

以下是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 

usrEncryptionpwdEncryption只是我遮蔽的U/P所以我們的服務支持登錄不是所有公衆。

當我嘗試並調用getUnread(conn)具有小程序開放了十餘MINUES我得到以下輸出後:

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 

異常塊並沒有真正似乎對這個問題,工作,這就是我真的需要幫助。那麼,我如何保持這種聯繫的活力和踢?

謝謝。

+0

聽起來像是超時。但默認情況下,imaplib中的'socket'沒有超時設置,所以Gmail可以這麼做嗎?你用不同的SMTP服務器得到不同的結果嗎? – Dave

回答

7

您需要通過重新初始化類重新連接,而不僅僅是登錄,使用

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

一個完整的例子:

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

感謝您的回覆。異常中的'e'是什麼? –

+0

'e'只是代表一個異常實例,您可以在'except'塊中執行'log.error(str(e))' – cxase

+0

很酷,謝謝。仍在學習。 –

3

我設法cxase的集成到了照顧定製IMAP類我所有的問題。這裏是任何人閱讀代碼:

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