#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 или что-то в конструкторе? Вам нужно будет проверить документ здесь) Я ожидаю, что вы каким-то образом отключаетесь, или вход в систему на самом деле не удался. Однако журнал может помочь вам/нам выяснить, что произошло между этими двумя шагами.