【问题标题】:Python IMAP scraper hangs indefinitelyPython IMAP 刮板无限期挂起
【发布时间】:2016-01-21 18:48:48
【问题描述】:

我正在尝试从我有权访问的 Gmail 帐户中的特定文件夹中抓取数据。

我最近在登录感兴趣的 Gmail 帐户时尝试在 Windows 7 上使用 Python 2.7 运行 this code。出于某种原因,尽管它似乎运行了很长时间(我将其放置了长达 40 分钟)而没有完成或提供错误。

就目前而言,我在 Gmail 帐户中定位的文件夹只有大约 50 封简单的文本电子邮件,没有附件、图片或任何可能表明该过程应该花费尽可能长的东西。在使用 IMAP 做类似的事情之前,有没有人遇到过这样的问题?

完整性代码:

#!/usr/bin/env python
#
# Very simple Python script to dump all emails in an IMAP folder to files.  
# This code is released into the public domain.
#
# RKI Nov 2013
#
import sys
import imaplib
import getpass

IMAP_SERVER = 'imap.gmail.com'
EMAIL_ACCOUNT = "notatallawhistleblowerIswear@gmail.com"
EMAIL_FOLDER = "Top Secret/PRISM Documents"
OUTPUT_DIRECTORY = 'C:/src/tmp'

PASSWORD = getpass.getpass()


def process_mailbox(M):
    """
    Dump all emails in the folder to files in output directory.
    """

    rv, data = M.search(None, "ALL")
    if rv != 'OK':
        print "No messages found!"
        return

    for num in data[0].split():
        rv, data = M.fetch(num, '(RFC822)')
        if rv != 'OK':
            print "ERROR getting message", num
            return
        print "Writing message ", num
        f = open('%s/%s.eml' %(OUTPUT_DIRECTORY, num), 'wb')
        f.write(data[0][1])
        f.close()

def main():
    M = imaplib.IMAP4_SSL(IMAP_SERVER)
    M.login(EMAIL_ACCOUNT, PASSWORD)
    rv, data = M.select(EMAIL_FOLDER)
    if rv == 'OK':
        print "Processing mailbox: ", EMAIL_FOLDER
        process_mailbox(M)
        M.close()
    else:
        print "ERROR: Unable to open mailbox ", rv
    M.logout()

if __name__ == "__main__":
    main()

【问题讨论】:

  • 打印出什么?你在数据中看到了什么?它会打印出写作信息吗?似乎一些“打印”调试会让你走得很远。
  • @Max 不幸的是,它似乎没有打印出任何东西。您认为开始打印调试的最佳方式是什么?有什么特别的地方吗?
  • This page 似乎建议添加行 imaplib.Debug = 4 以获取有关正在发生的事情的更多信息。
  • 就个人而言,我可以毫无问题地运行它。我在 Linux 上,使用 python 2.7.6。我只需要在 gmail 中允许不太安全的应用程序连接就可以了。它在不到 1 分钟的时间内处理了 20 封邮件(整个收件箱)。你有更多信息吗?
  • 虽然不是很专业,但我把print('checkpoint')放在我的代码中,看看程序到底挂在哪里。当您不知道问题出在哪里时,它会有所帮助,因为没有引发错误。

标签: python gmail imap


【解决方案1】:

代码对我来说很好用。下面,我在您的代码中添加了一些调试打印(使用pprint)来查看IMAP4_SSL 对象M 的属性。我的 Gmail 使用双重身份验证,所以我需要设置一个 gmail app password

from pprint import pprint 

# ....

M = imaplib.IMAP4_SSL(IMAP_SERVER)
print('---- Attributes of the IMAP4_SSL connection before login ----')
pprint(vars(M))

M.login(EMAIL_ACCOUNT, PASSWORD)
print('\n \n')
print('---- Attributes of the IMAP4_SSL connection after login ----')
pprint(vars(M))

# open specific folder
rv, data = M.select(EMAIL_FOLDER)
print('\n \n')
print('---- Data returned from select of folder = {}'.format(data))
  • 检查第一个pprint(vars(M)) 是否有:
    1. 'welcome': '\* OK Gimap ready for requests from ...
    2. 'port': 993,
  • 检查第二个pprint(vars(M)) 是否有:
    1. _cmd_log 成功登录:6: ('< PJIL1 OK **@gmail.com authenticated (Success)
  • M.select(EMAIL_FOLDER) 返回的data 应该是可供下载的电子邮件数量。

【讨论】:

  • 我尝试放入那些调试打印,但看起来代码甚至没有达到那个点,因为没有消息通过。我尝试了几个不同的电子邮件地址。检查两个帐户以确认不需要应用密码,收到消息“设置...不适用于您的帐户”。
  • 请查看 gmail 中的选项以启用“不太安全的应用程序”:support.google.com/accounts/answer/6010255?hl=en
  • 您的问题可能与此问题重复:stackoverflow.com/questions/25413301/…
  • 谢谢,我会调查这两个。我将奖励你赏金,否则它将被闲置,但我可能仍然需要一些帮助。
  • 更改安全设置似乎对不幸挂起的代码没有影响。
猜你喜欢
  • 1970-01-01
  • 2017-06-29
  • 2011-05-07
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 2019-08-01
相关资源
最近更新 更多