2012-07-31 6 views
3

Я пытаюсь получить доступ к своим письмам в Gmail из сценария python. Код, который я использую следующее:imaplib.select on large inbox: Слишком много аргументов для команды

import imaplib 
m = imaplib.IMAP4_SSL("imap.gmail.com") 
m.login("username","password") 
m.select("[Gmail]/All Mail") 

При выполнении этого кода в Python 2, он отлично работает, я получаю список всех моих писем. В python 3 наведите указатель на ошибку с ошибкой

>>> m.select("[Gmail]/All Mail") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.2/imaplib.py", line 674, in select 
    typ, dat = self._simple_command(name, mailbox) 
    File "/usr/lib/python3.2/imaplib.py", line 1121, in _simple_command 
    return self._command_complete(name, self._command(name, *args)) 
    File "/usr/lib/python3.2/imaplib.py", line 957, in _command_complete 
    raise self.error('%s command error: %s %s' % (name, typ, data)) 
imaplib.error: SELECT command error: BAD [b'[CLIENTBUG] Too many arguments for command'] 

Я проделал немного тестирования. Он отлично работает в другой папке, такой как «Входящие», где я получаю только 400 писем (против 6000 в «Все Mail»).

Это проблема, связанная с размером списка? Почему в python 2 и 3 он отличается?

Спасибо

ответ

6

Try используя m.select('"[Gmail]/All Mail"'), так что двойные кавычки получить передаются.

Я подозреваю, что imaplib неправильно цитирует строку, поэтому сервер получает то, что выглядит как два аргумента: [Gmail]/All и Mail.

+0

Отлично работает. Значит, это означает, что в Python 3 проблема будет считаться с каждым словом в качестве другого аргумента? –

+1

Похоже, что проблема в imaplib Python3 не обнаруживает, что аргумент нуждается в цитировании. В общем, если в ваших строках есть что-то другое, кроме букв и цифр, рекомендуется процитировать их сами. – Max

+0

Для меня проблема была в строке _byte и unicode string_ one. Если вы используете строки unicode, '' imaplib'' не обнаруживает, что ему требуется кавычка, и вы должны процитировать его самостоятельно. Это связано с ошибкой в ​​методе '' _checkquote() '' imaplib. Для справки, я использую imaplib 2.58. –