Python:Gmail未读邮件崩溃

don*_*ald 4 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
Run Code Online (Sandbox Code Playgroud)

工作完美,但有时崩溃:

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
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?

小智 13

您的脚本崩溃的原因是调用"except"块中的mail.login()会抛出一个永远不会被捕获的异常.

imaplib的文档说明当你得到imaplib.abort异常时,你应该重试你的命令.

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

异常IMAP4.abort IMAP4服务器错误导致引发此异常.这是IMAP4.error的子类.请注意,关闭实例并实例化新实例通常允许从此异常中恢复.

>>> help('imaplib')
Run Code Online (Sandbox Code Playgroud)

说同样的话:

"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()
Run Code Online (Sandbox Code Playgroud)


Sri*_*aju 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')
Run Code Online (Sandbox Code Playgroud)

您也可以尝试Gmail.py。我尝试使用这个简单的脚本来抽象简单的 imap 调用。

from gmail import *

gmail = GmailClient()
gmail.login('username','password')
unreadMail = gmail.get_inbox_conversations(is_unread=True)
print unreadMail
Run Code Online (Sandbox Code Playgroud)

意识到!!Gmail IMAP 存在客户端请求“过于频繁”进行身份验证的已知问题。除此之外,这可能会将您的帐户标记为需要通过验证码才能继续同步。请访问此处尝试解锁,然后重试。