3. Diagramma di stato e flusso (State and Flow Diagram)
Una volta stabilita la connessione tra client e server, una connessione IMAP4rev2 si trova in uno dei quattro stati. Lo stato iniziale è identificato nel messaggio di saluto del server. La maggior parte dei comandi è valida solo in determinati stati. È un errore di protocollo per il client tentare un comando mentre la connessione si trova in uno stato inappropriato, e il server risponderà con un risultato di completamento del comando BAD o NO (a seconda dell'implementazione del server).
3.1 Stato non autenticato (Not Authenticated State)
Nello stato non autenticato, il client deve (deve) fornire credenziali di autenticazione prima che la maggior parte dei comandi sia consentita. Questo stato viene inserito quando inizia una connessione, a meno che la connessione non sia stata pre-autenticata.
3.2 Stato autenticato (Authenticated State)
Nello stato autenticato, il client è autenticato e deve (deve) selezionare una casella di posta per accedervi prima che i comandi che influenzano i messaggi siano consentiti. Questo stato viene inserito quando inizia una connessione pre-autenticata, quando sono state fornite credenziali di autenticazione accettabili, dopo un errore nella selezione di una casella di posta, o dopo un comando CLOSE o UNSELECT riuscito.
3.3 Stato selezionato (Selected State)
In uno stato selezionato, è stata selezionata una casella di posta per accedervi. Questo stato viene inserito quando una casella di posta è stata selezionata con successo.
3.4 Stato di disconnessione (Logout State)
Nello stato di disconnessione, la connessione è in fase di terminazione. Questo stato può essere inserito come risultato di una richiesta del client (tramite il comando LOGOUT) o per azione unilaterale da parte del client o del server.
Se il client richiede lo stato di disconnessione, il server deve (deve) inviare una risposta BYE non contrassegnata e una risposta OK contrassegnata al comando LOGOUT prima che il server chiuda la connessione; e il client deve (deve) leggere la risposta OK contrassegnata al comando LOGOUT prima che il client chiuda la connessione.
Un server non dovrebbe (non dovrebbe) chiudere unilateralmente la connessione senza prima inviare una risposta BYE non contrassegnata che contenga il motivo per farlo. Un client non dovrebbe (non dovrebbe) chiudere unilateralmente la connessione; invece, dovrebbe (dovrebbe) emettere un comando LOGOUT. Se il server rileva che il client ha chiuso unilateralmente la connessione, il server può (può) omettere la risposta BYE non contrassegnata e semplicemente chiudere la sua connessione.
Diagramma di transizione di stato
+----------------------+
|connection established|
+----------------------+
||
\/
+--------------------------------------+
| server greeting |
+--------------------------------------+
|| (1) || (2) || (3)
\/ || ||
+-----------------+ || ||
|Not Authenticated| || ||
+-----------------+ || ||
|| (7) || (4) || ||
|| \/ \/ ||
|| +----------------+ ||
|| | Authenticated |<=++ ||
|| +----------------+ || ||
|| || (7) || (5) || (6) ||
|| || \/ || ||
|| || +--------+ || ||
|| || |Selected|==++ ||
|| || +--------+ ||
|| || || (7) ||
\/ \/ \/ \/
+--------------------------------------+
| Logout |
+--------------------------------------+
||
\/
+-------------------------------+
|both sides close the connection|
+-------------------------------+
Legenda
- (1) connessione senza pre-autenticazione (saluto OK)
- (2) connessione pre-autenticata (saluto PREAUTH)
- (3) connessione rifiutata (saluto BYE)
- (4) comando LOGIN o AUTHENTICATE riuscito
- (5) comando SELECT o EXAMINE riuscito
- (6) comando CLOSE o UNSELECT, codice di risposta CLOSED non richiesto, o comando SELECT o EXAMINE fallito
- (7) comando LOGOUT, spegnimento del server, o connessione chiusa