Поиск в Gmail с помощью imaplib

import imaplib

user = raw_input("Enter your GMail username:")
pwd = getpass.getpass("Enter your password: ")


m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,pwd)
m.select("[Gmail]/Inbox") # here you a can choose a mail box like INBOX instead
m.search("NEW")

Я пытаюсь выбрать только новые сообщения в Gmail через imap в Python. Проблема в том, что я всегда получаю следующую ошибку:

imaplib.error: команда SEARCH недопустима в состоянии AUTH

Я погуглил и прочитал, что мне придется использовать imap4, но я уже использую его, я не могу понять, как это решить.


person HankSmackHood    schedule 01.03.2011    source источник
comment
Папка называется INBOX, а не [Gmail]/Inbox. И я считаю, что Gmail не поддерживает флаг \Recent, поэтому поиск NEW никогда не будет соответствовать ни одному сообщению.   -  person dkarp    schedule 02.03.2011


Ответы (3)


Проблема в том, что нет почтового ящика с именем [Gmail]/Inbox. Можно получить список всех действительных почтовых ящиков, позвонив по номеру m.list().

Я обнаружил это, используя интерактивную оболочку Python (с Python 2.6), где он показывает ответ от сервера IMAP для каждой операции IMAP.

Примечание. При использовании интерактивной оболочки Python импорт pprint и вызов pprint.pprint(m.<method of m>(<params>)), вероятно, будет хорошей идеей для некоторых команд IMAP, которые возвращают большое количество информации.

person Abbafei    schedule 01.03.2011
comment
Вы правы, изменение его на Inbox решило проблему. Странно, поскольку сообщение об ошибке указывало на ПОИСК. - person HankSmackHood; 02.03.2011
comment
@JacobK: Может быть, imaplib генерирует исключения только для BAD, а не для NO? Вы получаете NO при попытке SELECT открыть несуществующую папку, но BAD при попытке SEARCH без успешного выбора папки. - person dkarp; 02.03.2011

Еще одна вещь - функция imaplib select() по умолчанию выбирает INBOX для вас, кажется чище.

http://docs.python.org/library/imaplib.html#imaplib.IMAP4.select

person Shay Rojansky    schedule 02.03.2011

Для меня было проблематично иметь «[Gmail]»:

т.е. изменить это:

m.select("[Gmail]/Inbox") 

к этому:

m.select("Inbox") 

Несмотря на это, использование m.list(), как предложил человек выше, является хорошим началом.

person Nam    schedule 10.02.2018