メールがサーバに届いても、それを取り出す方法がなければ読むことができない。そうした手段を提供するプロトコルの1つとしてPOPがある。POPは、サーバからメールを取り出すために使われてきた古典的なプロトコルだ。
POPの仕組み
かつてUNIXで電子メールが使われ始めたころは、ユーザーはUNIXホストにログインして作業する環境が一般的であった。メールは、ユーザーの作業するホストに直接届く仕組みになっていたので、作業の傍らでメールを読んでいた(図1)。
やがてPCでインターネットが利用できるようになると、ユーザーの作業環境はPCへと移行し、メールの届くホスト(メールサーバ)と作業環境が分離してしまった。そこでメールサーバに他のホストからアクセスし、手元でメールを読みたいという要求が生まれた。こうして開発されたプロトコルが「POP(Post Office Protocol )」である。現在使われているPOPはバージョン3(POP3と表記)で最新のドキュメントはRFC1939(Post Office Protocol Version 3)である。
さて、ホスト環境の変化から必要にせまられて誕生したPOPで実現しているものは何かというと、「サーバへの接続」「メッセージの回収」そして「サーバ上のメッセージの削除」である(図2)。これらの動作は、SMTPと同じようにコマンドによって対話的に進められる。
POP3セッションの流れとは?
図3は、POP3セッションとコマンドの対応を示したものだ。図の左側にPOP3セッションの状態を示し、その状態で受け付けるコマンドを対応させている。
POP3セッションは、SMTPと同じように、クライアントからTCPコネクションを接続することから始まる。クライアントがPOP3サーバ(ポート110 )に接続してTCPコネクションを確立すると、サーバは応答メッセージを送りセッションは「認証」の状態に移る。
POP3セッションが認証状態に移ると、次に行なわれるのがユーザー認証である。認証状態で受け付けられるコマンドはUSERコマンド、PASSコマンド、APOPコマンド、またはセッションを終了するQUITコマンドである。
さきの図1ではUSERコマンドでユーザーID、PASSでパスワードを送信しユーザー認証を行なっていた。一方、POP3の応答メッセージはSMTPのリプライコードのように複雑ではなく、成功の場合は「+OK」、失敗の場合は「-ERR」を応答の先頭に置き、その後に任意のメッセージを付加して送られる。この応答はPOP3セッションにおいて共通である。
認証が成功すると、そのユーザーのメールボックスがロックされ、POP3セッションは「トランザクション状態」に移る。メールボックスへの操作を行なうコマンドは、このトランザクション状態でなければ受け付けられない。POP3では、認証とトランザクションという状態とコマンドを対応付けることで、可能な操作を限定する仕組みになっている。
POP3のコマンド
図3では、トランザクション状態で受け付けられるおもなコマンドが示されている。それぞれのコマンドについて解説していこう。
STATコマンドはメールボックス内のメールの数及び合計サイズを問い合わせるコマンドである。応答は「+OK」の後に空白で区切った2つの数字が返される。初めに見える数字がメールの数で、後ろの数字がサイズを表わしている。ここで報告されるメールの数及びサイズには、削除マークのついたメッセージは含まれない。
UIDLコマンドは、指定されたメッセージに対するユニークなIDを出力するコマンドである。パラメータにメッセージ番号を指定すると、単一行の応答で「+OK」の後に空白で区切ったメッセージ番号とIDが返される。パラメータを省略した場合は、すべてのメッセージについて応答する。応答は空白で区切ったメッセージ番号とユニークなIDをメッセージごとに返す複数行の応答となる。POPの応答にはこのような複数行に渡る応答もあり、応答の最後は1個のピリオド「. 」だけの行を返し、それで終了となる。
UIDLコマンドで得られるIDは、メールヘッダのMessage-IDフィールドの値ではない。Message-IDフィールドは必須のフィールドではないため、メールメッセージに情報がないことが考えられるからである。またUIDLで出力されるIDは、長さが70文字以内の表示可能なUS-ASCII文字である。DELEコマンドで削除マークを付けなければ、どのPOPセッションでもUIDLコマンドでつねに同じ値が表示される。
RETRコマンドはパラメータにメッセージ番号を指定し、メッセージを取得するコマンドである。応答はメールメッセージとなる。RETRコマンドで指定できるメッセージ番号は1 つだけなので、STATコマンドやUIDLコマンドで複数のメッセージがあるとわかっていても、メッセージごとにRETRコマンドを送ってメッセージを取得する。応答は複数行の応答となり、応答の最後はメッセージ形式の規約に従って<CRLF>.<CRLF>の5バイトをもってメッセージの終端と判断する。
DELEコマンドは、パラメータのメッセージ番号で指定したメッセージに削除マークを付けるコマンドである。このコマンドでメッセージを削除するわけではない。削除マークの付けられたメッセージは、STATコマンドやLISTコマンドの応答の対象から外れる。
LISTコマンドは、メッセージのサイズを問い合わせるコマンドである。パラメータのメッセージ番号は省略できる。パラメータ自体を省略することもでき、その場合メールボックス内の削除マークの付いていないすべてのメールについての応答が返される。この場合の応答は複数行の応答となり、「+OK」の次の行から空白で区切ったメッセージ番号とサイズが1行1メッセージで返される。
このほか、削除マークが付いたすべてのメッセージからマークを取り除くRSETコマンドや、指定されたメッセージのヘッダとボディの指定行数分だけ取得するコマンドであるTOPコマンド、何もしないNOOPコマンドといったものがある。
そして最後は、QUITコマンドである。トランザクション状態でQUITコマンドを受け付けると、POP3セッションは更新(Update)状態に移り、削除マークのついたメッセージを削除し、POP3のセッションを終了する。QUITコマンドは認証状態でも使われるが、トランザクション状態でのQUITコマンドは、削除マークの付けられたメッセージを削除する契機となる。
●
以上、POP3セッションの状態との対応を意識しつつ、コマンドについて説明してきた。次回は、クライアントがメールを受信する際、POP3コマンドをどのように使っているか見てみよう。
本記事は、ネットワークマガジン2007年12月号の特集1「電子メールプロトコル再入門」を再編集したものです。内容は原則として掲載当時のものであり、現在とは異なる場合もあります。 |
この連載の記事
-
第9回
ネットワーク
いろいろな場所で同じメールを読めるIMAPの仕組みとは? -
第8回
ネットワーク
メールクライアントの動作からPOPのやりとりを見てみよう -
第6回
ネットワーク
SMTPの拡張機能を確かめる「EHLOコマンド」を知ろう! -
第5回
ネットワーク
メールを送る際に使われるSMTPの仕組みとは? -
第4回
ネットワーク
メールの添付ファイルを実現するMIMEのマルチパートとは? -
第3回
ネットワーク
メール誕生からある「7ビットの制約」を越えるMIMEとは? -
第2回
ネットワーク
メールの宛名はどこにある?ヘッダを理解する -
第1回
ネットワーク
電子メールを基礎の基礎から学んでいこう -
ネットワーク
電子メールプロトコル再入門<目次> - この連載の一覧へ