【问题标题】:Python: Gmail Unread Mails CrashesPython:Gmail 未读邮件崩溃
【发布时间】:2012-03-07 16:56:11
【问题描述】:
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

我该如何解决这个问题?

【问题讨论】:

    标签: python email gmail imap


    【解决方案1】:

    您的脚本崩溃的原因是在“except”块中调用 mail.login() 会引发一个从未被捕获的异常。

    imaplib 的文档指出,当您遇到 imaplib.abort 异常时,您应该重试您的命令。

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

    exception IMAP4.abort IMAP4 服务器错误导致此异常 提高。这是 IMAP4.error 的子类。请注意,关闭 实例并实例化一个新实例通常允许从 这个例外。

    还有

    >>> help('imaplib')
    

    也是这样说的:

    “abort”异常意味着连接应该被重置,并且 命令重试。

    以下是您可以解决的方法:

    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()
    

    【讨论】:

      【解决方案2】:

      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 尝试解锁,然后重试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多