Почему этот imap.select(«ВХОДЯЩИЕ») не будет работать так, как ожидалось для этой учетной записи Google mail?

#python #gmail-imap #imaplib

Вопрос:

Я работаю над приложением, которое должно войти в учетную запись электронной почты, чтобы обработать некоторые электронные письма. В этом случае учетная запись электронной почты запускается через google business suite (так что это не домен gmail).

Приложению удается войти в учетную запись электронной почты с помощью этой команды

 mail_client = imaplib.IMAP4_SSL(server) mail_client.login(user, password)  

Затем мне нужно просмотреть входящие, чтобы у меня был код

 mail_client.select("INBOX") (result, messages) = mail_client.search(None, 'ALL')  

Это приводит к ошибке

 imaplib.error: command SEARCH illegal in state AUTH, only allowed in states SELECTED  

Это странно, потому select что команда не сработала, можно было бы ожидать сообщения об ошибке, связанного с этим. Тем не менее, кажется, что с select командой все в порядке, но затем в следующей строке она действует так, как будто ничего не выбрано.

Я запустил следующий код, чтобы получить список папок, которые там есть:

 for i in mail_client.list()[1]:  print(i)  

и результат таков

 b'(\HasNoChildren) "/" "INBOX"' b'(\HasChildren \Noselect) "/" "[Gmail]"' b'(\All \HasNoChildren) "/" "[Gmail]/All Mail"' b'(\Drafts \HasNoChildren) "/" "[Gmail]/Drafts"' b'(\HasNoChildren \Important) "/" "[Gmail]/Important"' b'(\HasNoChildren \Sent) "/" "[Gmail]/Sent Mail"' b'(\HasNoChildren \Junk) "/" "[Gmail]/Spam"' b'(\Flagged \HasNoChildren) "/" "[Gmail]/Starred"' b'(\HasNoChildren \Trash) "/" "[Gmail]/Trash"'  

Я обнаружил, что код работает, если выбранная папка пуста. Но в тот момент, когда в нем действительно есть почта, я получаю ошибку (даже если раньше она работала пустой). Код также работает, если папка не пуста, но команда поиска ничего не вернет… как в, (result, messages) = mail_client.search(None, '(TO "non-existing@email.address")') … но в тот момент, когда результат поиска что-то вернет, я получаю ошибку.

Но мне нужно специально поискать в папке «Входящие».

Я также немного изменил код, чтобы проверить:

 status, message = mail_client.select('INBOX') print(f"status is {status}") print(f"message is {message}")  

и это дает

 status is OK message is [b'3']  

В поисках решения я нашел различные сообщения, в которых проблема заключалась в именах папок с пробелами, но я не смог найти никого, у кого была бы та же проблема, что и у меня.

Любая помощь будет очень признательна!

Комментарии:

1. Включите трассировку imaplib (debug=5 или что-то в конструкторе? Вам нужно будет проверить документ здесь) Я ожидаю, что вы каким-то образом отключаетесь, или вход в систему на самом деле не удался. Однако журнал может помочь вам/нам выяснить, что произошло между этими двумя шагами.