python - 如何使用 Python 通过 IMAP 访问 GMail 上的所有电子邮件?

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

我可以通过 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 封最近的电子邮件。当我遍历邮件号码时,对于 1790 以上的 ID,dataNone:

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")')

最佳答案

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

有一个获取所有IMAP文件夹的列表函数:

mail.list()

关于python - 如何使用 Python 通过 IMAP 访问 GMail 上的所有电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26395835/

相关文章:

python - 使用 Python Ctypes 和 C++ 时如何解决段错误?

python - Pandas 数字格式,带括号的负数

php - Magento 1.8.1.0 订单确认电子邮件 - 仅再次向销售人员发送电子邮件

css - outlook.com 如何将 css 定位到特定类

python - 在终端中使用 Python 函数

Python warnings.warn() 不返回任何内容

python - urllib.request.urlopen 出现 500 错误

python - 如果代理阻止 pip 下载,如何为学校下载 Python 模块

php - 如何向客户发送 WooCommerce 新订单电子邮件?

python-3.x - 如何使用按钮完全清除pygame窗口