Как исправить Python IMAP 'command CLOSE illegal in state AUTH, only allowed in states SELECTED'

Проблема:

У вас есть IMAP-код на Python, подобный

imap-example.py
server = imaplib.IMAP4_SSL('imap.mydomain.com')
server.login('email@mydomain.com', 'password')
# ...
# Cleanup
server.close()

но при запуске server.close() завершается с ошибкой с сообщением вроде

imap-traceback.txt
Traceback (most recent call last):
  File "./imaptest.py", line 13, in <module>
    server.close()
  File "/usr/lib/python3.6/imaplib.py", line 461, in close
    typ, dat = self._simple_command('CLOSE')
  File "/usr/lib/python3.6/imaplib.py", line 1196, in _simple_command
    return self._command_complete(name, self._command(name, *args))
  File "/usr/lib/python3.6/imaplib.py", line 944, in _command
    ', '.join(Commands[name])))
imaplib.error: command CLOSE illegal in state AUTH, only allowed in states SELECTED

Решение

Перед server.close() вы должны запустить server.select() хотя бы один раз. В случае сомнений просто server.select("INBOX"), потому что это всегда сработает.

Вставьте эту строку перед server.close():

imap-select-fix.py
server.select("INBOX")

Это должно выглядеть так:

imap-fixed-example.py
server = imaplib.IMAP4_SSL('imap.mydomain.com')
server.login('email@mydomain.com', 'password')
# ...
# Cleanup
server.select("INBOX")
server.close()

Полный пример см. Минимальный пример Python IMAP через SSL


Check out similar posts by category: Python