2011-09-27 24 views
5

में ईओएफ त्रुटि मैं एक पायथन एप्लेट प्रोग्रामिंग कर रहा हूं जो मेरे कार्यस्थल के लिए ईमेल बॉक्स की अपठित गिनती देखता है, और जब मैं ऐप्पल लगभग 10 मिनट तक निष्क्रिय रहता हूं तो किसी भी imaplib विधियों का उपयोग करने का प्रयास करते समय एक ईओएफ त्रुटि में भाग गया। जब तक ऐप्पल 10 मिनट से अधिक समय तक जीवित नहीं रहता तब तक सब ठीक काम करता है।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 और pwdEncryption बस मुझे यू/p मास्किंग तो हमारे हेल्पडेस्क लॉगिन सभी सार्वजनिक नहीं कर रहे हैं।

जब मैं कोशिश करते हैं और एप्लेट दस से अधिक MINUES मैं निम्नलिखित आउटपुट प्राप्त के लिए खुला होने के बाद getUnread(conn) फोन:

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 

अपवाद ब्लॉक does not वास्तव में समस्या, के लिए काम करने लगते हैं जो क्या है मैं वास्तव में मदद की ज़रूरत है। तो मैं इस कनेक्शन को जिंदा और लात कैसे रखूं?

धन्यवाद।

+0

लगता है कि यह समय समाप्त हो गया है। लेकिन डिफ़ॉल्ट रूप से imaplib में 'सॉकेट' पर कोई टाइमआउट सेट नहीं है, तो शायद यह जीमेल कर रहा है? क्या आपको एक अलग एसएमटीपी सर्वर के साथ अलग-अलग परिणाम मिलते हैं? – 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

उत्तर के लिए धन्यवाद। अपवाद में 'ई' क्या है? –

+0

'ई' सिर्फ एक अपवाद उदाहरण का प्रतिनिधित्व करने के लिए है, कि आप 'को छोड़कर' ब्लॉक – cxase

+0

कूल, धन्यवाद में 'log.error (str (e))' कर सकते हैं। सीखने का क्रम जारी है। –

3

मैं एक कस्टम imap वर्ग ख्याल रखा में cxase के एकीकृत करने में कामयाब मेरी सभी समस्याओं का। यहां पढ़ने वाले किसी के लिए कोड यहां दिया गया है:

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