4. データ形式 (Data Formats)
IMAP4rev2 はテキストコマンドとレスポンスを使用します。IMAP4rev2 のデータは、アトム (Atom)、数値 (Number)、文字列 (String)、括弧付きリスト (Parenthesized List)、または NIL のいずれかの形式をとることができます。特定のデータ項目は複数の形式をとることができることに注意してください。たとえば、"astring" 構文を使用すると定義されたデータ項目は、アトムまたは文字列のいずれかになります。
4.1 アトム (Atom)
アトム (Atom) は、1 つ以上の非特殊文字で構成されます。
4.1.1 シーケンスセットと UID セット (Sequence Set and UID Set)
メッセージのセットは、メッセージシーケンス番号または一意識別子を含むシーケンスセット (Sequence Set) によって参照できます。詳細については、セクション 9 を参照してください。シーケンスセットには、シーケンス番号の範囲 ("5:50" など)、特定のシーケンス番号の列挙、または上記の組み合わせを含めることができます。シーケンスセットは、特別な記号 "*" を使用して、メールボックス内の最大シーケンス番号を表すことができます。シーケンスセットに一意識別子が含まれることはありません。
"UID セット" (UID Set) はシーケンスセットに似ていますが、メッセージシーケンス番号の代わりに一意識別子を使用し、特別な記号 "*" を含むことは許可されていません。
4.2 数値 (Number)
数値 (Number) は 1 つ以上の数字文字で構成され、数値を表します。
4.3 文字列 (String)
文字列 (String) は 3 つの形式のいずれかです:同期リテラル (Synchronizing Literal)、非同期リテラル (Non-synchronizing Literal)、または引用文字列 (Quoted String)。同期リテラル形式は文字列の一般的な形式であり、文字列に含めることができる文字に制限はありません。非同期リテラル形式も一般的な形式ですが、長さの制限があります。引用文字列形式は、リテラルを処理するオーバーヘッドを回避する代替手段ですが、使用できる文字に制限があります。
同期リテラルと非同期リテラルの区別が重要でない場合、このドキュメントでは「リテラル」という用語のみを使用します。
同期リテラル (Synchronizing Literal) は、0 個以上のオクテット (CR および LF を含む) のシーケンスであり、左中括弧 (")、オクテット数、右中括弧 (")、および CRLF の形式でオクテットカウントでプレフィックス引用されます。サーバーからクライアントに送信される同期リテラルの場合、CRLF の直後にオクテットデータが続きます。クライアントからサーバーに送信される同期リテラルの場合、クライアントはオクテットデータ (およびコマンドの残り) を送信する前に、コマンド継続要求 (Command Continuation Request) を受信するまで待機しなければなりません (しなければならない)。
非同期リテラル (Non-synchronizing Literal) は同期リテラルの代替形式であり、クライアントからサーバーへ、同期リテラルが許可されている場所であればどこでも使用できます (してもよい)。非同期リテラル形式はサーバーからクライアントに送信してはなりません (してはならない)。非同期リテラルは、オクテットカウントと右中括弧 ("}") の間にプラス記号 ("+") があることで同期リテラルと区別されます。サーバーは非同期リテラルに応答してコマンド継続要求を生成せず、クライアントは非同期リテラルのオクテットを送信する前に待機する必要はありません。IMAP 拡張で特に指定されていない限り、非同期リテラルは 4096 オクテットより大きくてはなりません (してはならない)。4096 バイトより大きいリテラルは、同期リテラルとして送信しなければなりません (しなければならない)。
引用文字列 (Quoted String) は、CR と LF を除く 0 個以上の Unicode 文字のシーケンスであり、UTF-8 でエンコードされ、各端に二重引用符 (<">) 文字があります。
空の文字列は、"" (二重引用符の間に 0 文字の引用文字列)、{0} の後に CRLF (オクテットカウントが 0 の同期リテラル)、または {0+} の後に CRLF (オクテットカウントが 0 の非同期リテラル) として表されます。
注意:オクテットカウントが 0 の場合でも、同期リテラルを送信するクライアントはコマンド継続要求を受信するまで待機しなければなりません (しなければならない)。
4.3.1 8 ビットおよびバイナリ文字列 (8-Bit and Binary Strings)
8 ビットテキストおよびバイナリメールは、[MIME-IMB] コンテンツ転送エンコーディングの使用によってサポートされます。IMAP4rev2 実装は、リテラルで 8 ビットまたはマルチオクテット文字を送信してもよい (してもよい) が、[CHARSET] が識別されている場合にのみそうすべきです (すべきである)。
IMAP4rev2 は [I18N-HDRS] と互換性があります。その結果、8 ビットコンテンツを持つヘッダーフィールド値の識別文字セットは UTF-8 [UTF-8] です。IMAP4rev2 実装は、文字列に NUL、CR、または LF が含まれていない限り、引用文字列で [UTF-8] テキストを受け入れなければならず (しなければならない)、送信してもよい (してもよい)。これは IMAP4rev1 実装とは異なります。
BINARY コンテンツ転送エンコーディングが定義されていますが、BINARY.PEEK[<section-binary>]<<partial>> または BINARY[<section-binary>]<<partial>> FETCH データアイテムへの応答で <literal8> で返される場合を除き、エンコードされていないバイナリ文字列は許可されません。「バイナリ文字列」(Binary String) は、NUL 文字を含む任意の文字列です。過度の量の CTL 文字を含む文字列もバイナリと見なされる可能性があります (してもよい)。BINARY.PEEK[...]/BINARY[...] FETCH への応答で返される場合を除き、クライアントおよびサーバー実装は、データを送信する前にバイナリデータを base64 などのテキスト形式にエンコードしなければなりません (しなければならない)。
4.4 括弧付きリスト (Parenthesized List)
データ構造は「括弧付きリスト」(Parenthesized List) として表されます。これは、スペースで区切られ、各端が括弧で囲まれたデータ項目のシーケンスです。括弧付きリストには他の括弧付きリストを含めることができ、複数レベルの括弧を使用してネストを示します。
空のリストは () として表されます -- メンバーのない括弧付きリストです。
4.5 NIL
特殊な形式 "NIL" は、文字列または括弧付きリストとして表される特定のデータ項目の不存在を表し、空の文字列 "" または空の括弧付きリスト () とは異なります。
注意:NIL は、アトムの形式をとるデータ項目には決して使用されません。たとえば、メールボックス名 "NIL" は、存在しないメールボックス名ではなく、NIL という名前のメールボックスです。これは、メールボックスが "astring" 構文を使用するためです。これはアトムまたは文字列です。逆に、NIL の addr-name は存在しない個人名です。addr-name は "nstring" 構文を使用するためです。これは NIL または文字列ですが、決してアトムではありません。
例
次の LIST レスポンス:
* LIST () "/" NIL
は次と同等です:
* LIST () "/" "NIL"
これは、LIST レスポンス ABNF がメールボックス名に "astring" を使用しているためです。
ただし、次のレスポンス:
* FETCH 1 (BODY[1] NIL)
は次と同等ではありません:
* FETCH 1 (BODY[1] "NIL")
前者はボディパートの不在を示し、後者は 3 文字 "NIL" を含む文字列が含まれていることを意味します。