2013-04-19 11 views
5

Wie die folgende Fehlermeldung besagt, kann ich mich nicht anmelden, weil ich im Status LOGOUT bin und nicht im Status NONAUTH. Wie komme ich von LOGOUT zu NONAUTH?Warum kann ich mich nicht zweimal an einem Imap-Server in Python anmelden

Beispiel unten (natürlich die Anmeldeinformationen unter gefälscht sind)

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() 

Antwort

6

Was Sie versuchen, in IMAP ist illegal zu tun. Wenn Sie über RFC 3501 lesen, definiert es explizit Logout State als einen Zustand, aus dem es keine Rückgabe gibt. Ob du einen Fehler von imaplib selbst oder vom Server bekommst, oder du wirst wirklich unglücklich und es funktioniert und bringt dich in undefiniertes Verhalten Territorium ... die Antwort ist die gleiche: tu es nicht.

So haben Sie eine neue Verbindung zu dem Server erstellen erneut anmelden:

>>> 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)']) 

(Natürlich können Sie den gleichen Namen nicht imap_server die neuen Verbindung erneut binden müssen.)

+0

Vielen Dank! Das ist es genau! –

+0

Während Sie erklärt haben, dass der LOGOUT-Status ein Zustand ist, aus dem es keine Rückgabe gibt, haben Sie nicht genau erklärt, wie der OP in den Zustand NONAUTH übergeht - ist das der Zustand, in dem Sie sich befinden, wenn Sie eine IMAP-Verbindung herstellen? Das heißt, nach diesem 'imaplib.IMAP4_SSL ("imap.gmail.com", 993) '? Aber Sie können nicht aus einem anderen Staat in den Staat NONAUTH gelangen? Ich sehe keine Referenz in RFC3501. – Devy

+0

@Devy: Ich habe nicht die gesamte Zustandsmaschine von RFC 3501 erklärt, weil RFC 3501 es schon ziemlich gut erklärt. Abschnitt 3 sagt: "Der Anfangszustand wird in der Serverbegrüßung identifiziert." Abschnitt 3.1 sagt, "Nicht authentifizierter Status ... wird eingegeben, wenn eine Verbindung gestartet wird, es sei denn, die Verbindung wurde vorab authentifiziert." Andernfalls wird "Authentifizierter Status ... eingegeben, wenn eine vorab authentifizierte Verbindung gestartet wird". Nach 3.4 gibt es ein ASCII-ART-Diagramm, das alle Möglichkeiten zeigt, zu jedem Zustand zu gelangen. Es gibt keine Möglichkeit, zu "Nicht authentifiziert" zurückzukehren, wenn Sie es verlassen. – abarnert