Как получить доступ ко всем электронным письмам в GMail через IMAP с помощью Python?

Я могу получить доступ к своим электронным письмам, хранящимся в GMail, через imaplib следующим образом:

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 последних писем. Когда я повторяю номера почты, data равно None для идентификаторов выше 1790:

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

Как получить доступ ко всем моим электронным письмам в GMail через Python?

В веб-интерфейсе 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']

Теоретически диапазонные запросы должны работать примерно так, согласно документации по расширениям IMAP для Gmail< /а>. Однако когда я ищу диапазон дат, как в RFC 3501 , я получаю сообщения, которые были отправлены в течение этого периода времени:

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

person Bengt    schedule 16.10.2014    source источник
comment
Когда вы сдадитесь, попробуйте API   -  person John Mee    schedule 16.10.2014
comment
Как говорится на этом сайте, IMAP должен быть более полноценным. Возможно, мне следует использовать другой клиент imap, а не из стандартной библиотеки.   -  person Bengt    schedule 16.10.2014
comment
Почему бы тебе не сломать его? Собрать 1700, потом посмотреть на дату и собрать с этой даты до конца следующего 1700? Или просто делать это один месяц / год за один раз?   -  person John Mee    schedule 17.10.2014
comment
@JohnMee Спасибо, у меня уже была эта идея, и я мог заставить ее работать, так как задал свой вопрос. Я обновил его соответственно.   -  person Bengt    schedule 17.10.2014


Ответы (1)


Как оказалось, на самом деле в моем «ВХОДЯЩЕМ» находится не более 1700 писем, потому что я отфильтровываю большинство из них с помощью опции фильтра Gmail «пропустить входящие». Поиск выполняется только в выбранном почтовом ящике, поэтому search(None, 'ALL') на самом деле не получает все сообщения. Поэтому мне нужно перебрать все ярлыки gmail, соответственно. IMAP-папки.

Существует функция списка, которая получает все папки IMAP:

mail.list()
person Bengt    schedule 17.10.2014