2011-09-27 9 views
5

Tôi đang lập trình một applet python xem số lượng chưa đọc của hộp email cho nơi làm việc của tôi và gặp lỗi EOF khi tôi cố gắng sử dụng bất kỳ phương pháp imaplib nào sau khi applet ở chế độ rảnh trong khoảng 10 phút. Tất cả mọi thứ hoạt động tốt cho đến khi applet đã được sống trong hơn 10 phút.Lỗi EOF trong Imaplib

Đây là mã có liên quan cho đối tượng 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 chỉ là tôi che u/p để đăng nhập helpdesk của chúng tôi là không phải tất cả cộng đồng.

Khi tôi cố gắng và gọi getUnread(conn) sau khi applet mở cho hơn mười MINUES tôi nhận được kết quả như sau:

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 

Khối ngoại lệ doesnt thực sự dường như làm việc cho các vấn đề, đó là những gì tôi thực sự cần trợ giúp. Vì vậy, làm thế nào để giữ cho kết nối này còn sống và đá?

Cảm ơn.

+0

Có vẻ như đã hết giờ. Nhưng theo mặc định không có thời gian chờ được đặt trên 'socket' trong imaplib, vì vậy có thể Gmail đang làm việc đó? Bạn có nhận được các kết quả khác nhau với một máy chủ SMTP khác không? – Dave

Trả lời

7

Bạn cần phải kết nối lại bằng cách tái khởi tạo lớp, không chỉ đăng nhập, sử dụng

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

Một ví dụ hoàn chỉnh:

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

Cảm ơn bạn đã trả lời. 'E' cho ngoại lệ là gì? –

+0

'e' chỉ là đại diện cho một trường hợp ngoại lệ, bạn có thể thực hiện' log.error (str (e)) 'trong khối' except' – cxase

+0

Cool, cảm ơn. Vẫn đang học. –

3

tôi quản lý để tích hợp của cxase vào một lớp tùy chỉnh imap mà đã chăm sóc của tất cả các vấn đề của tôi. Đây là mã cho bất kỳ ai đọc điều này:

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