3. 状態とフロー図 (State and Flow Diagram)
IMAP4rev1プロトコルには4つの状態があります。ほとんどのコマンドは、特定の状態でのみ有効です。
3.1. 未認証状態 (Not Authenticated State)
未認証状態 (Not Authenticated State) では、クライアントは接続を確立しましたが、認証はまだ行われていません。この状態では、サーバーはまだクライアントを信頼していません。
未認証状態で有効なコマンドは:
- CAPABILITY - サーバーの機能を照会します
- NOOP - 何もしません(接続を維持)
- LOGOUT - 接続を終了します
- STARTTLS - TLS暗号化を開始します
- AUTHENTICATE - SASL認証メカニズムを使用して認証します
- LOGIN - ユーザー名とパスワードで認証します
認証が成功すると、プロトコルは認証済み状態 (Authenticated State) に移行します。
3.2. 認証済み状態 (Authenticated State)
認証済み状態 (Authenticated State) では、クライアントは認証されていますが、メールボックスはまだ選択されていません。この状態では、メールボックスレベルの操作が可能です。
認証済み状態で有効なコマンドは:
- 未認証状態のすべてのコマンド
- SELECT - メールボックスを選択して、選択済み状態に移行します
- EXAMINE - メールボックスを読み取り専用で選択します
- CREATE - 新しいメールボックスを作成します
- DELETE - メールボックスを削除します
- RENAME - メールボックスの名前を変更します
- SUBSCRIBE - メールボックスをサブスクライブします
- UNSUBSCRIBE - メールボックスのサブスクライブを解除します
- LIST - メールボックスのリストを取得します
- LSUB - サブスクライブされたメールボックスのリストを取得します
- STATUS - メールボックスのステータス情報を取得します
- APPEND - メールボックスにメッセージを追加します
SELECTまたはEXAMINEコマンドが成功すると、プロトコルは選択済み状態 (Selected State) に移行します。
3.3. 選択済み状態 (Selected State)
選択済み状態 (Selected State) では、メールボックスが選択されており、メッセージレベルの操作が可能です。この状態では、メッセージの読み取り、検索、変更、削除などの操作を実行できます。
選択済み状態で有効なコマンドは:
- 認証済み状態のすべてのコマンド
- CHECK - メールボックスのチェックポイントを要求します
- CLOSE - 選択されたメールボックスを閉じて、認証済み状態に戻ります
- EXPUNGE - 削除マークの付いたメッセージを永久に削除します
- SEARCH - メールボックス内のメッセージを検索します
- FETCH - メッセージデータを取得します
- STORE - メッセージフラグを変更します
- COPY - メッセージを別のメールボックスにコピーします
- UID - UIDを使用してコマンドを実行します
別のメールボックスのSELECTまたはEXAMINE、CLOSEコマンド、またはLOGOUTコマンドによって、選択済み状態が終了します。
3.4. ログアウト状態 (Logout State)
ログアウト状態 (Logout State) では、接続が終了しています。サーバーはBYEレスポンスを送信し、接続を閉じます。
LOGOUTコマンドは、どの状態からでも発行できます。LOGOUTコマンドが発行されると、サーバーはタグなしBYEレスポンスを送信し、その後タグ付きOKレスポンスを送信して、接続を閉じます。
状態遷移図:
+----------------------+
|connection established|
+----------------------+
||
\/
+-------------------------------+
| initial greeting |
+-------------------------------+
|| (1)
\/
+-------------------------------+
| 未認証状態 |
| Not Authenticated State |
+-------------------------------+
|| (2)
\/
+-------------------------------+
| 認証済み状態 |
| Authenticated State |
+-------------------------------+
|| (3)
\/
+-------------------------------+
| 選択済み状態 |
| Selected State |
+-------------------------------+
|| (4)
\/
+-------------------------------+
| ログアウト状態 |
| Logout State |
+-------------------------------+
||
\/
+-------------------------------+
| connection closed |
+-------------------------------+
遷移:
- (1) 接続確立後、自動的に未認証状態に入ります
- (2) LOGINまたはAUTHENTICATEコマンドの成功により認証済み状態に移行
- (3) SELECTまたはEXAMINEコマンドの成功により選択済み状態に移行
- (4) LOGOUTコマンドまたは接続切断によりログアウト状態に移行
重要な注意事項:
- クライアントは、現在の状態で有効なコマンドのみを送信すべきです (SHOULD)
- サーバーは、現在の状態で無効なコマンドに対してBADレスポンスを返すべきです (SHOULD)
- LOGOUTコマンドは、すべての状態から実行できます