PR
コマンドと応答の形式

 クライアントが送信するコマンドは、予約語と引数からなる1行が基本で、図5のような形式になっています。予約語は、3文字または4文字で、引数がある場合には、その後ろにスペースを置いてから引数を並べます。引数がない場合には、予約語の後ろにスペースは置きません。行末は必ずCRLFになっています。

図5 コマンドは、3または4文字のキーワードと後続するスペース、そして引数から構成されている。引数がないコマンドもある。行全体の長さはRFC1939では47バイト(最後のCRLFである2バイト分を含む)以下と定義された。

 予約語は大文字で送信します。サーバーは小文字であっても大文字と同じく解釈できるように作られていなければなりません。

 応答は、図6のような形式となっており、最初に「+OK」(肯定的応答)または「-ERR」(否定的応答)のどちらかが来ます。「+OK」は、コマンドが正常に実行されたことを、「-ERR」はそうでなかったことを表します。また、このあとに、スペース(必ず1つ)と理由などを示す文字列が送られてきます。

図6 応答は、先頭に“+OK”、“-ERR”のどちらかで始まり、スペースを1つ空けて応答内容に関連した文字列が続く。この文字列は、人間が解釈可能なもので、POPプログラムは原則としてこの部分を解釈しない。

 文字列は原則としてユーザーに理由を通知するためのもので、コンピュータが解釈するものではありません。同じ原因によるエラーであっても、この文字列部分は、POP3サーバー・プログラムによって違ったものになる可能性があります。

 では、どうしてこのような文字列が送られるのかというと、プロトコルを観察しているユーザーにエラーの原因などを通知するためです。このメッセージによって、エラーの原因などを調べるのが容易になるわけです。POP3に限らず、ほかのテキスト・ベースのプロトコルでもこうした文字列が応答に含まれることは多く、これが1つのスタイルにもなっています。

 応答は、必ずしも1行とは限りません。複数行の応答が返って来ることもあります。このような場合、最後に「.CRLF」とピリオドだけの行が送られ、これが応答の最後を示します。応答が複数になるかどうかはコマンドによって決まっています。たとえば、サーバーの動作をリセットするRSETコマンドに対する応答は必ず1行のみです。逆に、サーバー上のメールのリストを取得するLISTコマンドに対する応答は、どんな場合でも複数行となります。サーバーにメールが1通もない場合でも複数行の応答を返します。

 応答の最後は1つのピリオドで表しますが、たとえば読み出したメールの中にピリオドだけの行が入っていた場合には、ピリオドをさらに追加してピリオド2つの行に変換します。これは、たとえピリオドが2つ、3つだけの行でも同様で、ピリオド3つ、4つの行に変換されます。この処理があるため、ピリオド1つだけの行は常に応答の終わりとして認識できます。クライアントは、ピリオドだけを含む行を受け取ったら、最後のピリオドを1つ取り除けば、どの場合でも元の行に戻ります。

 POP3は、TelnetのNVTの初期状態を基本としているため、通信形式としては半2重となり、送信するのはサーバー、クライアントのどちらか一方です。このため、コマンドは、応答を完全に受信してから送信しなければなりません。したがって、サーバーは、応答の送信中にコマンドを受信することはありません。

この記事は会員登録で続きをご覧いただけます

日経クロステック登録会員になると…

新着が分かるメールマガジンが届く
キーワード登録、連載フォローが便利

さらに、有料会員に申し込むとすべての記事が読み放題に!
日経電子版セット今なら2カ月無料