2012-03-07 42 views
4
import imaplib, re 
import os 
import time 
import socket 

imap_host = 'imap.gmail.com' 
mail = imaplib.IMAP4_SSL(imap_host) 
mail.login("[email protected]", "sddd") 

while True: 
    try: 
     print 'Connecting to Inbox..' 
     mail.select("inbox") # connect to inbox. 
     result, data = mail.uid('search', None, 'UNSEEN') 
     uid_list = data[0].split() 
     print len(uid_list), 'Unseen emails.' 
     if len(uid_list) > 20: 
     os.system('heroku restart --app xx-xx-203') 
     time.sleep(30) 
    except: 
     print 'Error' 
     imap_host = 'imap.gmail.com' 
     mail = imaplib.IMAP4_SSL(imap_host) 
     mail.login("[email protected]", "xxx") 
     pass 

完美的作品,但有時它與崩潰:的Python:Gmail的封未讀郵件崩潰

Restarting processes... done 
Connecting to Inbox.. 
Error 
Traceback (most recent call last): 
    File "gmail_new9.py", line 24, in <module> 
    mail.login("[email protected]", "ddddd") 
    File "/usr/lib/python2.6/imaplib.py", line 498, in login 
    typ, dat = self._simple_command('LOGIN', user, self._quote(password)) 
    File "/usr/lib/python2.6/imaplib.py", line 1060, in _simple_command 
    return self._command_complete(name, self._command(name, *args)) 
    File "/usr/lib/python2.6/imaplib.py", line 893, in _command_complete 
    self._check_bye() 
    File "/usr/lib/python2.6/imaplib.py", line 808, in _check_bye 
    raise self.abort(bye[-1]) 
imaplib.abort: [UNAVAILABLE] Temporary System Error 

我怎樣才能解決這個問題?

回答

1

imap的端口號碼是多少?沒有要求?我一直在使用下面的代碼&它的工作原理。檢查是否爲你的作品太 -

import imaplib 

gmail = imaplib.IMAP4_SSL('imap.gmail.com',993) 
gmail.login('username','password') 
gmail.select("inbox") 
result, data = gmail.uid('search', None, 'UNSEEN') 

你也可以嘗試Gmail.py。我試圖用這個簡單的腳本來抽象簡單的imap調用。

from gmail import * 

gmail = GmailClient() 
gmail.login('username','password') 
unreadMail = gmail.get_inbox_conversations(is_unread=True) 
print unreadMail 

注意! Gmail IMAP有known issues,客戶請求「經常」驗證身份。除此之外,這可能會標記您的帳戶需要通過驗證碼才能繼續同步。 Visit here嘗試解鎖,然後重試。

13

你的腳本崩潰的原因是對「except」塊內的mail.login()的調用會拋出一個永遠不會被捕獲的異常。

imaplib的文檔指出,當您收到imaplib.abort異常時,您應該重試您的命令。

http://docs.python.org/library/imaplib

例外IMAP4.abort IMAP4服務器錯誤導致這個例外是 提高。這是IMAP4.error的一個子類。請注意,關閉 實例並實例化一個新實例通常會允許從 中恢復此例外情況。

而且

>>> help('imaplib') 

說是相同的:

「中止」 例外暗示連接應復位, 命令重新審判。

這裏是你如何解決這個問題:

import imaplib, re 
import os 
import time 
import socket 

def connect(retries=5, delay=3): 
    while True: 
     try: 
      imap_host = 'imap.gmail.com' 
      mail = imaplib.IMAP4_SSL(imap_host) 
      mail.login("[email protected]", "sddd") 
      return mail 
     except imaplib.IMAP4_SSL.abort: 
      if retries > 0: 
       retries -= 1 
       time.sleep(delay) 
      else: 
       raise 

mail = connect() 
while True: 
    try: 
     print 'Connecting to Inbox..' 
     mail.select("inbox") # connect to inbox. 
     result, data = mail.uid('search', None, 'UNSEEN') 
     uid_list = data[0].split() 
     print len(uid_list), 'Unseen emails.' 
     if len(uid_list) > 20: 
     os.system('heroku restart --app xx-xx-203') 
     time.sleep(30) 
    except: 
     print 'Error' 
     mail = connect()