Skip to main content
 首页 » 编程设计

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

2024年10月25日35傻小

我可以通过 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,data 为 None:

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