IMAP はステートフルなメールアクセスプロトコルです。RFC 9051 は IMAP4rev2 を定義し、RFC 3501 の IMAP4rev1 に取って代わります。クライアントはサーバー上のメールボックスとメッセージ状態を管理するため、複数のクライアントが同じメールボックスを表示できます。
接続とコマンド #
IMAP は TCP 上のテキストプロトコルです。ポート 143 は平文で開始し、STARTTLS で TLS をネゴシエートできます。ポート 993 は接続確立時から TLS を使用します。クライアントはケーパビリティを取得し、パスワード認証前に TLS をネゴシエートし、証明書とホスト名の検証を必須にする必要があります。
プロトコルの状態によって使用できるコマンドが制限されます。
- 未認証状態では、クライアントはケーパビリティ、TLS、認証をネゴシエートする。
- 認証済み状態では、メールボックスを管理および一覧表示できる。
- 選択済み状態では、1 つのメールボックスを選択し、メッセージ状態を取得または変更できる。
LOGOUTはログアウト状態に入り、サーバーのタグなしBYEとタグ付き完了応答の後にセッションを閉じる。
各クライアントコマンドは、クライアントが選択したタグで始まります。サーバー応答は、タグなし (*)、継続要求 (+)、タグ付き完了応答のいずれかです。
S: * OK IMAP4rev2 ready
C: A001 CAPABILITY
S: * CAPABILITY IMAP4rev2 STARTTLS SASL-IR
S: A001 OK completed
C: A002 STARTTLS
S: A002 OK begin TLS negotiation nowTLS 後は、ケーパビリティが異なる場合があるため、クライアントは再度 CAPABILITY を送信します。サーバーとクライアントが対応している場合は、LOGIN ではなく SASL 認証メカニズムを使用してください。
メールボックスとメッセージ #
認証済み接続では、メールボックスの一覧表示、作成、名前変更、購読、選択ができます。SELECT はメールボックスを読み書き可能で開き、EXAMINE は読み取り専用で開きます。メッセージにはメールボックスの変更に伴って変化するシーケンス番号と、UIDVALIDITY エポック内で安定した一意識別子 (UID) があります。永続的なクライアントは UID を使用し、UIDVALIDITY を記録し、変更時に再同期する必要があります。
メールボックス名はオペレーティングシステムのパスではなく、プロトコル文字列です。LIST を使用して階層区切り文字と名前を検出し、サーバーが提供する UTF-8 名を保持し、必要に応じて引用するかリテラルとして送信します。INBOX は大文字と小文字を区別しませんが、その他の名前はサーバーの規則に従って区別される場合があります。
システムフラグには \Seen、\Answered、\Flagged、\Deleted、\Draft があります。クライアントは STORE でメッセージを削除済みとマークし、EXPUNGE で \Deleted とマークされたメッセージを削除します。メールボックスの同時更新を受け取る可能性があるワークフローでは、シーケンス番号を避けてください。
FETCH はメッセージ属性または本文セクションを取得し、SEARCH は一致するメッセージを返します。IMAP リテラルは、引用文字列内に安全に現れないデータを運びます。サーバーはクライアントが同期リテラルを送信する前に継続要求を送信できます。{4096}\r\n のようなリテラルマーカーは、直後に続くオクテット数を正確に宣言します。パーサーはリテラル内容から改行を探すのではなく、その長さを消費する必要があります。
アイドルと同期 #
IDLE により、クライアントは接続を維持したままメールボックスの変更を未要請で受信できます。クライアントは別のコマンドを送信する前に DONE で IDLE を終了する必要があります。UID ベースの同期、UID FETCH、サーバーのケーパビリティ検査により、メールボックスのスナップショットを永久に安定したものとして扱うことを避けられます。
メールボックスが選択されている間、タグなしの EXISTS、EXPUNGE、FETCH などの応答が変更を報告します。EXPUNGE により後続のシーケンス番号が振り直されるため、クライアントはシーケンスマップを直ちに更新し、永続的な状態の識別には UID を使い続ける必要があります。最後に認識した UID、フラグ、UIDVALIDITY、関連する変更状態を保存します。両方のピアが広告している場合、CONDSTORE や QRESYNC などの拡張により転送量を削減できますが、フォールバックでは正しい UID ベースの再スキャンを実行する必要があります。
IMAP はメッセージのバイト列とメタデータを転送し、MIME はメール本文の構造と転送エンコーディングを定義します。IMAP の行指向コマンドエンコーディングを 7 ビットのパッキング方式と混同しないでください。IMAP コマンド行は ASCII 構文を使用し、リテラルはオクテットを転送します。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)