Python:Gmail未读邮件崩溃

时间:2012-03-07 16:56:12

标签: python email gmail imap

import imaplib, re
import os
import time
import socket

imap_host = 'imap.gmail.com'
mail = imaplib.IMAP4_SSL(imap_host)
mail.login("xxx@example.com", "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("xxx@example.com", "xxx")
        pass

完美无缺,但有时会崩溃:

Restarting processes... done
Connecting to Inbox..
Error
Traceback (most recent call last):
  File "gmail_new9.py", line 24, in <module>
    mail.login("xxx@ccc.com", "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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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("xxx@example.com", "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()

答案 1 :(得分:1)

imap的端口号在哪里?不是必须的吗?我一直在使用以下代码&amp;有用。检查它是否也适合你 -

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客户端要求“过于频繁”进行身份验证。除此之外,这可能会标记您的帐户要求通过CAPTCHA以继续同步。 Visit here尝试解锁,然后重试。