|
|

 |
メール配送の仕組み(3)
著者: (株)ネットエイジ melpod 開発チーム プリンター用 記事を転送
▼2003年10月2日 00:00 付の記事
□国内internet.com発の記事
前回、送信された電子メールが MTA(Mail Transfer Agent: メールサーバー上で動作するメールソフト)によってメールボックスに届けられるまでを説明しました。
今回はメールサーバーのメールボックスに届いたメールを受信者がどのように確認するのか、つまり「メール受信の仕組み」を見ていきたいと思います。
■ POP と IMAP
メールの受信者は、MUA(Mail User Agent: エンドユーザーが使うメールソフト)を使って、自分のメールボックスにアクセスします。この時 MUA が使用するプロトコルが、POP (Post Office Protocol) や IMAP (Internet Message Access Protocol) です。
MUA はメールを送信する時には SMTP (Simple Mail Transfer Protocol) を使いますが※1、メールを受信する時には POP や IMAP を使います。
また通常、MUA にまでメールが自動的に届くことはありません。映画などでおなじみの「You’ve Got Mail!」は、実際には MUA から定期的にメールボックスにアクセスして、届いたメールがあるかないかを確認することで実現しています。
POP と IMAP は、どちらも MUA がメールボックスからメールを受信するためのプロトコルです。POP は RFC1939 で規定され、認証機能とメールの確認・読み込み・削除といったシンプルな機能を持っています。
IMAP は RFC3501 で規定されている、POP よりも新しいプロトコルで、POP と比較して多くの機能を持っています。最も大きな特徴としては、メールサーバー上にフォルダを作成できることが挙げられるでしょう。
IMAP の機能は、例えば複数の場所で同じメールボックスからメールを読むようなケースで効果を発揮します。例として会社のデスクトップPCでメールを読んでフォルダに整理したあと、外出先のノートブックPCからメールをチェックした場合を考えてみましょう。
POP の場合は「一度メールボックスから取り込んだメールは二度とメールボックスから取り込めない」か、「再び新着メールとして取り込んで、またフォルダに整理し直す」ということになりますが、IMAP を使えば一度読んでメールサーバー上のフォルダに整理したメールは、別のPCから見ても同じフォルダに整理された状態で見えるようになります。
このように IMAP は POP より多機能ですが、そのぶんサーバーの資源(CPU やハードディスク容量など)を多く必要とします。そのため多くの一般向け ISP のサービスでは、POP だけをサポートしているようです。IMAP は主にビジネス向けのサービスや、企業内でよく利用されています。
ここでは、より広く使われている POP を例にとって、その動作を見ていきたいと思います。
■ POP の仕組み
前回説明した SMTP と同様、POP もテキスト文字列を使ったプロトコルです。現在広く使われている POP Version 3 (POP3) では、TCP の110番ポートを使って通信します。
では前回同様、telnet コマンドを利用して動作を観察してみましょう。まず最初に telnet コマンドで、POPサーバーの TCP 110番ポートに接続します。Linux ならシェルから、Windows ならコマンドプロンプトから、以下のように入力します。
telnet メールサーバーのIPアドレス 110
うまく接続できれば、サーバーから以下のような文字列が返ってくるはずです。以下、サーバーからの返答は先頭に [S] を、こちらから入力して送信した文字列は先頭に [C] をつけて区別します。
[S] +OK POP3 server ready
「+OK」のあとのメッセージは、POP サーバーの種類によって様々ありますが、気にする必要はありません。POP サーバーからの返答は、成功した場合の「+OK」か、失敗した場合の「-ERR」のどちらかです。
さて POP では、まず最初に自分のメールボックスにアクセスするための認証を行わなければなりません。ここではユーザー「luke」が認証を行うところを見てみましょう。
[C] USER luke
[S] +OK Password required.
[C] PASS password-of-luke
[S] +OK logged in.
もし間違ったパスワードを入力すると、サーバーからは「-ERR」が返ってきます。「+OK」が返ってきたなら、認証は成功しました。
それではまず、メールボックスにメールが届いているかどうかを確認しましょう。メールボックスの状態は STAT というコマンドで、メールごとのサイズは LIST コマンドで確認できます。
[C] STAT
[S] +OK 2 936
これは、luke のメールボックスに2通のメッセージがあり、サイズが合計で 936 byte であることを示しています。
[C] LIST
[S] +OK
[S] 1 468
[S] 2 466
[S] .
これは、1番のメッセージが 468 byte、2番のメッセージが 466 byte という意味です。メッセージは2番までで終わりなので、サーバーからの返答終了の印として、最後に ピリオドだけの1行が返ってきます。
実際にメールの内容を確認するためには、RETR コマンドに続けて、上記で取得したメッセージ番号を指定します。
[C] RETR 1
[S] +OK
[S] Date: Tue, 30 Sep 2003 22:20:01 +0900 (JST)
[S] Message-Id: <20030930.222001.61217897.test@internet.com>
[S] To: luke@skywalker.example.com
[S] Subject: test mail
[S] From: Han
[S]
[S] やあルーク、これはテストメールだ。
[S] .
このように、RETR ではヘッダも含めた生のメールデータを取得することができます。
読んだメールを削除するのは DELE コマンド、そして接続を終了するのが QUIT コマンドです。
[C] DELE 1
[S] +OK
[C] QUIT
[S] +OK
これで、メッセージ番号1のメールを削除して、終了しました。
ここまで、POP のもっとも単純な動作例をひととおり眺めてきました。
POP は非常にシンプルなプロトコルです。筆者は、メールの受信に障害がある場合に、telnet コマンドで POP を使って問題を切り分けることがあります。例えば巨大なメールが1通あるために受信が滞るようなケースでは、問題のメールを DELE してから MUA で受信すると、スムーズに受信できることなどがあります。
■ POP とセキュリティ
上述のとおり POP でメールサーバーにアクセスする場合、認証時に入力するパスワードが丸見えなことに気がついたと思います。
POP パスワードは画面上で丸見えなのと同様に、ネットワークで上も暗号化されることなく流れていきます。メールをチェックするたびに、平文のパスワードが流れますので、途中経路でパケットを盗聴すれば、そのままパスワードを獲得することが出来てしまいます。
セキュリティの脆弱な USER/PASS による認証のかわりに用意されている手段が、APOP です。メールサーバーが(自宅や自社内などプライベートなネットワークでなく)グローバルなインターネット上にある場合は、必ずAPOP を使うのがよいでしょう。
APOP に対応したメールサーバの TCP 110番ポートにアクセスすると、以下のような文字列が返ってきます。
[S] +OK server ready <10362.1064935770@pop.example.com>
最後につけられた <10362.1064935770@pop.example.com> という部分がメールサーバーで自動的に生成された文字列で、この文字列を key にワンタイムパスワード(使い捨てのパスワード)を生成するのが APOP の仕組みです。
APOP では、サーバーから送られてきた文字列の後ろにパスワードをつなげたものを、MD5※2 形式に変換して、ワンタイムパスワードを生成します。上記の例では、
<10362.1064935770@pop.example.com>password-of-luke
を MD5 演算する(最後に改行コードが含まれないよう注意)と、
116f757c47f8f132351c8dc703d0ee8d
という値が得られます。
この値を、以下のように APOP コマンドで送信します。
[C] APOP luke 116f757c47f8f132351c8dc703d0ee8d
[S] +OK
これで +OK が返れば認証完了です。USER/PASS で認証した後と同様に STAT や LIST コマンドを使うことができます。
■まとめ
以上、3回に渡ってメールの送信、配送、受信に至るまで、その仕組みを説明してきました。メール配送を実現しているプロトコルの仕組みが、意外と単純なことに驚かれたのではないでしょうか?
Keep it simple は最も重要なインターネットの精神であり、インターネットを支えるプロトコルも単純であることが尊重されます。
ここで紹介した SMTP や POP 以外にも、telnet コマンドを使ってテキストベースで実験できるプロトコルは様々なものがあり、それらの仕様も多くは RFC として公開されています。興味を持たれた方は、ぜひ色々なプロトコルに挑戦してみてください。
※1…MUA からのメール送信については、メール配送の仕組み(1) を参照してください。
※2…MD5 (Message-Digest 5) とは、RFC1321 で規定された一方向ハッシュ関数を使用して 128bit の「要約データ」を作成する方法のことです。一方向ハッシュ関数で求められた値は計算結果から元データを復元することが出来ない特性から、よく認証に利用されています。
MD5 の演算結果は32桁の16進数文字列として取得できます。Linux や多くの Unix 処理系では、md5sum や md5 コマンドを使用して、MD5 演算を行うことが可能です。
(執筆:佐藤 僚)
|

 |
|