このページの本文へ

電子メールプロトコル再入門 第7回

サーバからメールを取り出すプロトコルはどう動く?

メールの受信用に作られたPOPを学ぶ

2011年03月17日 06時00分更新

文● 遠藤哲

  • この記事をはてなブックマークに追加
  • 本文印刷

 メールがサーバに届いても、それを取り出す方法がなければ読むことができない。そうした手段を提供するプロトコルの1つとしてPOPがある。POPは、サーバからメールを取り出すために使われてきた古典的なプロトコルだ。


POPの仕組み

 かつてUNIXで電子メールが使われ始めたころは、ユーザーはUNIXホストにログインして作業する環境が一般的であった。メールは、ユーザーの作業するホストに直接届く仕組みになっていたので、作業の傍らでメールを読んでいた(図1)。

図1●メールサーバに接続してメールを読んだ初期のメールシステム

 やがてPCでインターネットが利用できるようになると、ユーザーの作業環境はPCへと移行し、メールの届くホスト(メールサーバ)と作業環境が分離してしまった。そこでメールサーバに他のホストからアクセスし、手元でメールを読みたいという要求が生まれた。こうして開発されたプロトコルが「POP(Post Office Protocol )」である。現在使われているPOPはバージョン3(POP3と表記)で最新のドキュメントはRFC1939(Post Office Protocol Version 3)である。

 さて、ホスト環境の変化から必要にせまられて誕生したPOPで実現しているものは何かというと、「サーバへの接続」「メッセージの回収」そして「サーバ上のメッセージの削除」である(図2)。これらの動作は、SMTPと同じようにコマンドによって対話的に進められる。

図2●メールをサーバから持ってくるPOPの利用

POP3セッションの流れとは?

 図3は、POP3セッションとコマンドの対応を示したものだ。図の左側にPOP3セッションの状態を示し、その状態で受け付けるコマンドを対応させている。

図3●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「電子メールプロトコル再入門」を再編集したものです。内容は原則として掲載当時のものであり、現在とは異なる場合もあります。

カテゴリートップへ

この連載の記事