3. Zustands- und Flussdiagramm (State and Flow Diagram)
Sobald die Verbindung zwischen Client und Server hergestellt ist, befindet sich eine IMAP4rev2-Verbindung in einem von vier Zuständen. Der Anfangszustand wird in der Server-Begrüßung identifiziert. Die meisten Befehle sind nur in bestimmten Zuständen gültig. Es ist ein Protokollfehler für den Client, einen Befehl zu versuchen, während sich die Verbindung in einem unangemessenen Zustand befindet, und der Server wird mit einem BAD- oder NO-Befehlsabschlussergebnis antworten (abhängig von der Serverimplementierung).
3.1 Nicht authentifizierter Zustand (Not Authenticated State)
Im nicht authentifizierten Zustand muss (muss) der Client Authentifizierungsinformationen bereitstellen, bevor die meisten Befehle zugelassen werden. Dieser Zustand wird betreten, wenn eine Verbindung startet, es sei denn, die Verbindung wurde vorauthentifiziert.
3.2 Authentifizierter Zustand (Authenticated State)
Im authentifizierten Zustand ist der Client authentifiziert und muss (muss) ein Postfach auswählen, um darauf zuzugreifen, bevor Befehle, die Nachrichten betreffen, zugelassen werden. Dieser Zustand wird betreten, wenn eine vorauthentifizierte Verbindung startet, wenn akzeptable Authentifizierungsinformationen bereitgestellt wurden, nach einem Fehler bei der Auswahl eines Postfachs oder nach einem erfolgreichen CLOSE- oder UNSELECT-Befehl.
3.3 Ausgewählter Zustand (Selected State)
In einem ausgewählten Zustand wurde ein Postfach zum Zugriff ausgewählt. Dieser Zustand wird betreten, wenn ein Postfach erfolgreich ausgewählt wurde.
3.4 Abmeldezustand (Logout State)
Im Abmeldezustand wird die Verbindung beendet. Dieser Zustand kann als Ergebnis einer Client-Anforderung (über den LOGOUT-Befehl) oder durch einseitige Aktion seitens des Clients oder Servers betreten werden.
Wenn der Client den Abmeldezustand anfordert, muss (muss) der Server eine nicht getaggte BYE-Antwort und eine getaggte OK-Antwort auf den LOGOUT-Befehl senden, bevor der Server die Verbindung schließt; und der Client muss (muss) die getaggte OK-Antwort auf den LOGOUT-Befehl lesen, bevor der Client die Verbindung schließt.
Ein Server sollte (sollte nicht) die Verbindung nicht einseitig schließen, ohne zuerst eine nicht getaggte BYE-Antwort zu senden, die den Grund dafür enthält. Ein Client sollte (sollte nicht) die Verbindung nicht einseitig schließen; stattdessen sollte (sollte) er einen LOGOUT-Befehl ausgeben. Wenn der Server erkennt, dass der Client die Verbindung einseitig geschlossen hat, kann (kann) der Server die nicht getaggte BYE-Antwort weglassen und einfach seine Verbindung schließen.
Zustandsübergangsdiagramm
+----------------------+
|connection established|
+----------------------+
||
\/
+--------------------------------------+
| server greeting |
+--------------------------------------+
|| (1) || (2) || (3)
\/ || ||
+-----------------+ || ||
|Not Authenticated| || ||
+-----------------+ || ||
|| (7) || (4) || ||
|| \/ \/ ||
|| +----------------+ ||
|| | Authenticated |<=++ ||
|| +----------------+ || ||
|| || (7) || (5) || (6) ||
|| || \/ || ||
|| || +--------+ || ||
|| || |Selected|==++ ||
|| || +--------+ ||
|| || || (7) ||
\/ \/ \/ \/
+--------------------------------------+
| Logout |
+--------------------------------------+
||
\/
+-------------------------------+
|both sides close the connection|
+-------------------------------+
Legende
- (1) Verbindung ohne Vorauthentifizierung (OK-Begrüßung)
- (2) Vorauthentifizierte Verbindung (PREAUTH-Begrüßung)
- (3) Abgelehnte Verbindung (BYE-Begrüßung)
- (4) Erfolgreicher LOGIN- oder AUTHENTICATE-Befehl
- (5) Erfolgreicher SELECT- oder EXAMINE-Befehl
- (6) CLOSE- oder UNSELECT-Befehl, unaufgeforderter CLOSED-Antwortcode oder fehlgeschlagener SELECT- oder EXAMINE-Befehl
- (7) LOGOUT-Befehl, Server-Herunterfahren oder Verbindung geschlossen