2013-04-19 1 views
5

Как указано ниже в сообщении об ошибке, я не могу войти в систему, потому что я в состоянии LOGOUT, а не в состоянии NONAUTH. Как я могу получить от LOGOUT до NONAUTH?Почему я не могу войти на сервер imap дважды в Python

Пример ниже (очевидно, учетные данные для входа фальшивы ниже)

Python 2.7.3 (default, Aug 1 2012, 05:14:39) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import imaplib 
>>> imap_server = imaplib.IMAP4_SSL("imap.gmail.com",993) 
>>> imap_server.login('[email protected]', 'mypassword') 
('OK', ['[email protected] Joe Smith authenticated (Success)']) 
>>> imap_server.logout() 
('BYE', ['LOGOUT Requested']) 
>>> imap_server.login('[email protected]', 'mypassword') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/imaplib.py", line 505, in login 
    typ, dat = self._simple_command('LOGIN', user, self._quote(password)) 
    File "/usr/lib/python2.7/imaplib.py", line 1070, in _simple_command 
    return self._command_complete(name, self._command(name, *args)) 
    File "/usr/lib/python2.7/imaplib.py", line 825, in _command 
    ', '.join(Commands[name]))) 
imaplib.error: command LOGIN illegal in state LOGOUT, only allowed in states NONAUTH 
>>> quit() 

ответ

6

То, что вы пытаетесь сделать, это незаконно в IMAP. Если вы читаете более RFC 3501, он явно определяет Logout State как состояние, из которого нет возврата. Получаете ли вы ошибку от самого imaplib или от сервера, или вам действительно не повезло, и оно работает и выводит вас на территорию неопределенного поведения ... ответ тот же: не делайте этого.

Таким образом, вы должны создать новое подключение к серверу снова войти в систему:

>>> imap_server.logout() 
('BYE', ['LOGOUT Requested']) 
>>> imap_server = imaplib.IMAP4_SSL("imap.gmail.com",993) 
>>> imap_server.login('[email protected]', 'mypassword') 
('OK', ['[email protected] Joe Smith authenticated (Success)']) 

(Конечно, вы не должны перепривязывают то же имя imap_server к новому соединению.)

+0

Благодаря! Это точно! –

+0

Пока вы объяснили, что состояние LOGOUT - это состояние, из которого нет возврата, вы точно не объяснили, как OP переходит в состояние NONAUTH - это состояние, в котором вы находитесь, когда вы делаете соединение IMAP? То есть после этого 'imaplib.IMAP4_SSL (" imap.gmail.com ", 993)'? Но вы не можете добраться до состояния NONAUTH из любого другого государства? Я не вижу ссылок в RFC3501. – Devy

+0

@Devy: Я не объяснил весь автомат штата от RFC 3501, потому что RFC 3501 уже объясняет это довольно хорошо. В разделе 3 говорится: «Исходное состояние идентифицировано в приветствии сервера». В разделе 3.1 говорится: «Не проверенное состояние ... вводится, когда соединение начинается, если соединение не было предварительно аутентифицировано». В противном случае «Идентифицированное состояние ... вводится при запуске предварительно аутентифицированного соединения». После 3.4 есть диаграмма ASCII-ART, которая показывает все способы добраться до каждого состояния. Невозможно вернуться к «Не проверен подлинности», если вы оставите его. – abarnert