2013-04-19 31 views
5

Jak pokazuje poniższy komunikat o błędzie, nie mogę się zalogować, ponieważ jestem w stanie LOGOUT, a nie w stanie NONAUTH. Jak dostać się z LOGOUT do NONAUTH?Dlaczego nie mogę zalogować się do serwera IMAP dwa razy w Pythonie

Przykład poniżej (oczywiście poświadczenia logowania są sfałszowane poniżej)

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

Odpowiedz

6

Co starasz się zrobić to nielegalne w IMAP. Jeśli czytasz ponad RFC 3501, jawnie definiuje Logout State jako stan, z którego nie ma powrotu. Niezależnie od tego, czy otrzymasz błąd z samej imaplib, czy z serwera, albo uzyskasz naprawdę pecha i zadziała i zabierze Cię na terytorium o nieokreślonym zachowaniu ... odpowiedź jest taka sama: nie rób tego.

Tak, trzeba utworzyć nowe połączenie do serwera, aby ponownie zalogować:

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

(Oczywiście nie musisz ponownie powiązać tę samą nazwę imap_server do nowego połączenia).

+0

Dzięki! Dokładnie to! –

+0

Podczas wyjaśniania, że ​​stan LOGOUT jest stanem, z którego nie ma powrotu, nie wyjaśniłeś dokładnie, w jaki sposób OP przechodzi w stan NONAUTH - czy jest to stan, w którym się znajdujesz, gdy nawiązujesz połączenie IMAP? To znaczy po tym 'imaplib.IMAP4_SSL (" imap.gmail.com ", 993)'? Ale nie możesz dostać się do stanu NONAUTH z żadnego innego państwa? Nie widzę żadnego odniesienia w RFC3501. – Devy

+0

@Devy: Nie wyjaśniłem całego stanu maszyny z RFC 3501, ponieważ RFC 3501 już to wyjaśnia. Sekcja 3 mówi: "Początkowy stan jest identyfikowany na powitanie serwera." Sekcja 3.1 mówi, "Nieuznany stan ... jest wprowadzany, gdy połączenie się rozpocznie, chyba że połączenie zostało wcześniej uwierzytelnione." W przeciwnym razie "Uwierzytelniony stan ... jest wprowadzany po uruchomieniu wstępnie uwierzytelnionego połączenia". Po wersji 3.4 znajduje się diagram ASCII-ART, który pokazuje wszystkie sposoby dotarcia do każdego stanu. Nie ma sposobu, aby powrócić do Nieuwierzytelnionego, jeśli go opuścisz. – abarnert