【问题标题】:How to access all emails on GMail via IMAP using Python?如何使用 Python 通过 IMAP 访问 GMail 上的所有电子邮件?
【发布时间】:2014-12-11 07:32:46
【问题描述】:

我可以通过 imaplib 访问我存储在 GMail 中的电子邮件,如下所示:

import imaplib

mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(username, password)
mail.select(mailbox='INBOX', readonly=True)

_, data = mail.search(None, '(ALL)')

但是data 仅包含 1790 封最近的电子邮件。当我遍历邮件号码时,dataNone 对于 1790 以上的 id:

for i in itertools.count(start=1):
    _, data = mail.fetch(str(i), "RFC822")

如何通过 Python 访问我在 GMail 上的所有电子邮件?

在 GMail 的网络界面中,我可以像这样搜索范围查询:

"in:anywhere after:2014-01-01 before:2014-01-02"

但是 Python 无法解析这样的查询:

  _, data = mail.search(None, '(ALL "in:anywhere")')
File "/usr/local/lib/python3.4/imaplib.py", line 660, in search
  typ, dat = self._simple_command(name, *criteria)
File "/usr/local/lib/python3.4/imaplib.py", line 1134, in _simple_command
  return self._command_complete(name, self._command(name, *args))
File "/usr/local/lib/python3.4/imaplib.py", line 965, in _command_complete
  raise self.error('%s command error: %s %s' % (name, typ, data))
imaplib.error: SEARCH command error: BAD [b'Could not parse command']

范围查询在理论上应该有点像according to the docs on Gmail's IMAP extensions。但是,当我 search for a range of dates as in RFC 3501 时,我收到了在该时间范围内发送的消息:

_, data = mail.search(None, '(SINCE "01-Jan-2011" BEFORE "01-Jan-2012")')

【问题讨论】:

  • 放弃的时候试试the API
  • 正如该网站所述,IMAP 应该更加“成熟”。也许我应该使用另一个 imap 客户端而不是标准库中的客户端。
  • 你为什么不把它分解呢?收集1700,然后看日期,从那个日期收集到下一个1700结束?还是一次只做一个月/一年?
  • @JohnMee 谢谢,自从提出我的问题以来,我已经有了这个想法并且可以让它发挥作用。我相应地更新了它。

标签: python email python-3.x gmail gmail-imap


【解决方案1】:

事实证明,我的“收件箱”中实际上不超过 1700 封电子邮件,因为我使用 Gmail 的“跳过收件箱”过滤器选项过滤掉了其中的大部分。搜索只在选定的邮箱中搜索,因此search(None, 'ALL') 实际上并没有得到所有邮件。所以我需要遍历所有的gmail标签。 IMAP 文件夹。

有一个获取所有IMAP文件夹的列表功能:

mail.list()

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 1970-01-01
    • 2020-02-26
    • 2011-11-02
    • 1970-01-01
    • 2014-08-22
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多