2013-04-19 16 views
5

Come indica il seguente messaggio di errore, non riesco ad accedere perché sono in stato LOGOUT e non in stato NONAUTH. Come posso passare da LOGOUT a NONAUTH?Perché non riesco ad accedere a un server imap due volte in Python

esempio che segue (ovviamente le credenziali di accesso sono falsi seguito)

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

risposta

6

quello che stai cercando di fare è illegale in IMAP. Se si legge su RFC 3501, definisce esplicitamente Logout State come stato da cui non viene restituito. Se ricevi un errore dallo imaplib stesso, o dal server, o sei veramente sfortunato e funziona e ti porta in un territorio di comportamento non definito ... la risposta è la stessa: non farlo.

Quindi, è necessario creare una nuova connessione al server per accedere di nuovo:

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

(Certo che non c'è bisogno di associare nuovamente lo stesso nome imap_server per la nuova connessione.)

+0

Grazie! Questo è esattamente! –

+0

Mentre hai spiegato che lo stato di LOGOUT è uno stato da cui non si ottiene alcun ritorno, non hai spiegato esattamente come l'OP entra in uno stato di NONAUTH - è lo stato in cui ti trovi quando fai una connessione IMAP? Cioè, dopo questo 'imaplib.IMAP4_SSL (" imap.gmail.com ", 993)'? Ma non puoi arrivare allo stato di NONAUTH da nessun altro stato? Non vedo alcun riferimento in RFC3501. – Devy

+0

@Devy: Non ho spiegato l'intero stato macchina da RFC 3501 perché RFC 3501 lo spiega già abbastanza bene. La sezione 3 dice: "Lo stato iniziale è identificato nel saluto del server". La sezione 3.1 dice "Stato non autenticato ... viene immesso all'avvio di una connessione a meno che la connessione non sia stata pre-autenticata." Altrimenti, "Stato autenticato ... viene immesso all'avvio di una connessione pre-autenticata". Dopo 3,4 c'è un diagramma ASCII-ART che mostra tutti i modi per arrivare a ogni stato. Non è possibile tornare a Non autenticato se lo si lascia. – abarnert