2014-10-16 6 views
2

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

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?

В webinterface 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")') 
+0

Когда вы сдаетесь, попробуйте [АНИ] (https://developers.google.com/gmail/api/) –

+0

Как то сайта, IMAP должен быть более «полноценным». Возможно, я должен использовать другой клиент imap, чем тот, который есть в стандартной библиотеке. – Bengt

+0

Почему бы вам не сломать его? Соберите 1700, затем посмотрите дату и получите с этой даты до конца следующего 1700 года? Или просто сделать это один месяц/год за раз? –

ответ

1

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

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

mail.list()