連載
» 2003年05月28日 00時00分 公開

TCP/IPアレルギー撲滅ドリル(4):ちょっとジミなPOP3でメールを読む

[福永勇二,インタラクティブリサーチ]

素朴な疑問

  • 無視がイチバン?!
    1. このごろ広告メールが多すぎて……
  • POP3サーバはジミ子さん
    1. メールボックスを読み出すプロトコルは何でしたっけ? 忘れちゃった
    2. 自分のメールを他人に読まれたりしないか心配です
    3. メッセージのやりとりを見れば理解できそうですね?
  • せっかくだからもうちょっと詳しく
    1. POP3にはどんなコマンドがあるんでしょうか?
    2. POP3の応答メッセージを教えてください
  • 意外と深刻なノゾキ問題を考える
    1. パスワードがばれちゃう?
    2. 書かずに確認? 一体、どうやるの? 大胆解説
    3. 書かずに確認するカラクリをPOP3で説明すると?
  • つないで試して、はいナットク
    1. メールを読み出しているところを見せてください

無視がイチバン?!

このごろ広告メールが多すぎて……

 このごろSPAMメール(勝手に送り付けられる広告メール)がガンガン届いて、ホント迷惑してる! って方、多いんじゃないでしょうか? ある知人は、「指定のあて先に、配送停止のお願いメールを出したのに、もう全然ダメ」なんていってましたが、実はこれは逆効果。ジャマな広告メールを増やすことにもなりかねません。

 なぜそんなことになるかというと、配信停止の依頼が、実質的に「このメールアドレスはちゃんと読んでますよ?」と知らせるのと同じだからです。広告メール業者にしてみれば、「ちゃんと読まれているメールアドレス」=「ぜひ広告メールを送りたいメールアドレス」です。そのためメールアドレス売買の業界では人気商品ってことになりますね。そんな裏事情もあり、配信を断るほどさらに多くの業者からSPAMメールが届く、なんて皮肉な結果になってしまうわけです。

 じゃあ、一体どうすりゃいいの? 答えは「ひたすら無視する」です。メールソフトの自動振り分け機能を使って、この手のメールにありがちな言葉を含んだメールは、即時ゴミ箱へ直行させちゃいましょう。100%とはいきませんが、それなりに何とか対処できます。間違っても返事を出しちゃダメですよ。

 なぜ、こんな話をしたかというと、メールというものは、それを受け取る人が内容を読んで、初めて意味があるということを強調したかったのでした。今回は、そっちの側、メールを受け取る部分のプロトコルを見ていきましょう。

POP3サーバはジミ子さん

メールボックスを読み出すプロトコルは何でしたっけ? 忘れちゃった

 写真や音楽も付いて見た目の華やかなHTTPや、メール配送のカナメなんて説明されるSMTPに比べると、今回登場するPOP3はちょっとジミかもしれません。なぜかって? だって、活躍の範囲が狭いんですもん。自分あてのメールがたまっているサーバにつないで、単純にメールを読み出してくるだけ、たったそれだけの働きしかしません。送信はSMTPの機能ですから、メール機能の半分だけやっている感じです。

 でも名前だけはエラそうで、POP3は“Post Office Protocol Version 3”を短く略したものです。実際は“Post Office”というより“PostBox”なんですけどね。連載第3回「SMTPでメール送信の舞台裏をあやつる」で登場したイラストでは、わが家のポストに届いた手紙を取りに行く、その部分がPOP3の働きということになります。

自分のメールを他人に読まれたりしないか心配です

 新しいマンションなら、ポストにも鍵が付いてたりします。でも一軒家のポストだと鍵らしい鍵がなかったりして、郵便物の秘密はそれなりです。一方、電子メールの場合、他人のメールを読むことはちょっとやそっとじゃできません。理由は、POP3でメールを読み出すときに、パスワードを指定するようになっているからです。パスワードをちゃんと秘密にしておけば、普通は、他人がメールを盗み読みすることはありませんので安心です。

 話はちょっとそれますが、パスワードを秘密にしておいても、メールを盗み読みされる場合があります。1つはシステム管理者がのぞき見るケース。システム管理者はメールサーバのすべてを操作できますので、当然、その中身をのぞくこともできます。普通は、そんなことしちゃいけない、というシステム管理者のモラルが働くのですが、そうでない人もいるようです。もう1つは、メールの内容をチェックするソフトがメールサーバに組み込んである場合。機密が書いてあるメールや、個人的なメールを見つけると、上司などに自動報告するようなシステムもあると聞きます。職場のメールアドレスで転職相談をしたり、学校のアドレスで先生の悪口を言ったりするのは……少々、チャレンジンジャーですね。

メッセージのやりとりを見れば理解できそうですね?

 POP3くらいジミなプロトコルだと、メッセージのやりとりを見るだけで、全体の感じをかなりしっかりつかめると思います。図1がPOP3でメールを読むときのよくあるメッセージのやりとりです。

図1 POP3でメールを読み出すときの典型的なやりとり 図1 POP3でメールを読み出すときの典型的なやりとり

 この中で行われていることは、大きく3つのステップで考えることができます。最初に「本人であることの確認」、次に「メールボックスにたまっているメールをリストアップ」、最後に「メールの内容を読み出して、削除マークを付ける」です。このステップは、私たち人間がメールを読むときの動作とほぼ同じ流れになっています。

 RETRコマンドでメールを読み出す動作は、メールボックスにたまっているそれぞれのメールについて実行するのが普通でしょう。DELEコマンドは、指定したメールをサーバ上から消すように「マークを付ける」コマンドです。マークを付けたメールの削除は、最後のQUITコマンドを受け付けた後に、行われることになっています。

 ちなみに、メールソフトの設定画面に「メールをサーバに残す」なんてチェックボックスがありますが、あれはDELEコマンドを送信しないというのと同じ意味です。この図を見れば、ほら、一目で分かりますね。

せっかくだからもうちょっと詳しく

POP3にはどんなコマンドがあるんでしょうか?

 アグレッシブにメールサーバを制覇! と思っている方には、コマンド一覧(表1)の方が見応えがありますよね。

種類 コマンド 機能
認証 USER メールボックス名 読み出すメールボックスを指定する
PASS パスワード メールボックスのパスワードを指定する
APOP メールボックス名
ダイジェスト
読み出すメールボックスと、パスワードに代わるダイジェストを指定する
メール操作応答コード STAT メールボックスにたまっているメール数とサイズを問い合わせる
LIST [メッセージ番号] メールボックスにたまっている各メールについて、メッセージ番号とサイズを問い合わせる
RETR メッセージ番号 メッセージ番号で指定したメールの内容を表示する
DELE メッセージ番号 メッセージ番号で指定したメールに削除マークを付ける
NOOP 何もしない
RSET すべての削除マークをクリアする
情報更新 QUIT 削除マークが付いたメールをサーバ上で削除し、接続を終了する
表1 主な応答コードとその意味

 POP3の主要なコマンドと、その機能の一覧表です。POP3のコマンドとして定義されているものは、このほかにも若干あるのですが、ここでは大部分のPOP3サーバで利用できる、主要なコマンドをピックアップしました。

 ユーザーが本人であるか確認、つまり「認証」機能としては、図1に登場したUSERとPASSがあります。この2つは問題ありませんね。APOPについては、後半で詳しく説明します。「メール操作」機能には、先に登場したLIST、RETR、DELEのほかに、メールボックスにたまっているメール数と合計サイズを問い合わせるSTAT、すべての削除マークをクリアするRSET、そして何もしないNOOPがあります。また「情報更新」機能に分類されるものには、やはり先の図に出てきたQUITがあります。これも説明は不要でしょう。

POP3の応答メッセージを教えてください

 サーバにコマンドを与えると、その処理結果に応じて、サーバは応答メッセージを返してくれます。応答メッセージには、

+OK
-ERR

の2つがあります。意味は文字通り、+OKが「コマンドの処理を正常に行った」で、-ERRが「コマンドの処理が正常に行えなかった」です。また、大部分の応答メッセージでは、私たち人間にとって分かりやすいような文章の形で、これらの後に処理内容に対するメッセージが書かれています。

 メール番号の一覧やメール内容など、サーバが返す結果が複数の行になってしまう場合には、+OKの次の行からそれらの内容が始まり、内容の最後に“.”だけの行が来ることになっています。なおPOP3のコマンドや応答メッセージでは、行末を表す改行コードにCR/LFを使用することになっています。

意外と深刻なノゾキ問題を考える

パスワードがばれちゃう?

 これまでこの連載に登場してきたHTTPSMTPと同じく、POP3もコマンドや応答メッセージは、すべてそのまま見える形のメッセージでやりとりしています。だから、後でやってみますが、Telnetでつないで、サーバとのやりとりを体験できるわけです。

 でも、ここに1つ頭が痛い問題が……。何かというとパスワードです。メールボックスのパスワードは、

PASS Ijd8ekk#89

のように、PASSコマンドの後に書くんですが、いくらネットワークの中とはいっても、こんなふうにモロにパスワードを書くのは、ちょっと危険です。なぜかって? それはネットワークにノゾキ魔がいるかもしれないからです。

 電気が行き来してるネットワークが見えるわけないじゃん、と思うかもしれませんが、ネットワークの中身をのぞくのは、実は私たちが想像するよりもずっと簡単です。必要な道具はネットワークアナライザなどと呼ばれる専用の装置、または専用プログラムを組み込んだPCだけ。ハッカーなどと呼ばれる特殊技術を持った人はもちろんのこと、ちょっとした勉強をすれば、高校生でもできる程度の難しさです。だから、ネットワークの中だといって、パスワードを直接書くのはちょっと危険というワケです。

書かずに確認? 一体、どうやるの?大胆解説いたします

 そこで登場するのが、「パスワードを書かずに、お互いにパスワードを確認する」という秘儀。なんだか禅問答のようなこの方法、当然ながら、ちょっとしたカラクリがあります。普通、このカラクリは小難しく説明されることが多いようですが、ここでは大胆に分かりやすく説明してみます。

 図2を見てください。Aさんは、Bさんにミックスジュースをあげました。凝り性のBさんは、もらったミックスジュースに「イチゴ10gとバナナ20g」を加えて、別のミックスジュースを作り、それが結構おいしいので、再びAさんに分けてあげました。

図2 パスワードをやりとりせずにパスワードを確認するカラクリ 図2 パスワードをやりとりせずにパスワードを確認するカラクリ

 実はこのときAさんも、味がちょっと気に入らなくて、もう一工夫とばかりさらに別の材料を加えていたのですが、なんと偶然にもそれは「イチゴ10gとバナナ20g」。BさんからジュースをもらったAさん、それぞれを飲み比べてびっくり! どっちもまったく同じ味です。そこでAさんはこう考えました。「ははん、Bさんも、同じように『イチゴ10gとバナナ20g』を加えたんだな」。

 2人がジュースをやりとりするとき、実際に運んでいたのはCさんでした。Cさんは、AさんがBさんにあげたジュース、BさんがAさんに返したジュース、それぞれをちょっと失敬して、両方のジュースの味見をしてみました。Cさんは、それぞれのジュースの味が違うことは分かったのですが、何を何グラム加えたらその味になるのかまでは分かりませんでした。まあ、普通に考えて、ミックスジュースの味の違いから、その材料の違いを見抜くのは並大抵のことではありません。

 ここで、話を元に戻しましょう。このストーリーの中の、「イチゴ10gとバナナ20g」をパスワードだと考えてみてください。でき上がったジュースの味を比べてみて、その味がまったく同じなら、追加した材料はどちらも「イチゴ10gとバナナ20g」だということができます。ここで重要なのは、AさんとBさんは、「イチゴ10gとバナナ20g」というパスワードを、直接やりとりしていない点です。パスワードに基づいて作り出した、ジュースの味という別の情報を通して、間接的にパスワードが同じであることを確認したわけです。

 また、2つのジュースの味を知っているCさんは、ジュースの味が違うことは分かりますが、その違いからパスワード「イチゴ10gとバナナ20g」を見抜くことはまず不可能です。どんな材料が含まれているか、それが何グラムか、その組み合わせは膨大なため、現実的な時間でそれを解き明かすことはできないからです。

 では、ここでAさんをPOP3サーバ、Bさんをメールを読み出す人、Cさんをノゾキ魔と置き換えて考えてみましょう。POP3サーバとメールは、この期間、一切パスワードはやりとりしていません。しかし、お互いに知っているパスワードが同じであることを確認することができました。またノゾキ魔は、POP3サーバとユーザーのやりとりを覗きましたが、そこで得た内容から、それぞれのパスワードを知ることはできませんでした。そう、これこそが、「パスワードを書かずして、パスワードを確認する」という、禅問答のようなカラクリなのです。

書かずに確認するカラクリをPOP3で説明すると?

 AさんからBさんに最初に渡されたジュースに相当するものは、POP3サーバに接続したとき最初に返ってくる+OKメッセージの中に書いてあります。例えばこんな感じです。

+OK <13386.1053143830@pop.atmarkit.co.jp>

 このうち<13386.1053143830@pop.atmarkit.co.jp>の部分が元のジュースに相当するものです。この文字は「チャレンジ文字列」ともいいます。

 チャレンジ文字列を受け取ったメールソフトは、この文字列とパスワードを基に、新しいジュースに相当するものを作り出します。これは「ダイジェスト」とか「レスポンス文字列」と呼ばれていて、APOPコマンドを使ってPOP3サーバに知らせます。APOPコマンドは、それ1つでUSERコマンドとPASSコマンドの代わりをするもので、次のように書きます。

APOP メールボックス名 ダイジェスト

 ダイジェストは例えば「4a25880d19034b05ea27a3de98109343」のようなものになります。このダイジェストは、チェレンジ文字列の後にパスワードをくっつけ、その全体をMD5という関数に与えて得られた値です。この辺りはちょっと話が難しいので、MD5がどんなものかの詳細は省略しますが、簡単にいえば、

                 MD5で処理
チャレンジ文字列 + パスワード ──────→ ダイジェスト
となる流れのうち、ダイジェストとチャレンジ文字列から、パスワードを推測できないようになっている関数、ということになります。

つないで試して、はいナットク≫

メールを読み出しているところを見せてください

 では、実際にTelnetで接続して、メールを読み出してみましょう。自分で試してみる方は、普段使っているPOP3サーバを使うのが適当です。IPアドレスはメールソフトのPOPサーバ欄に設定してあるものを確認しておきましょう。また実験を始める前には、大事なメールをなくさないように、あらかじめ普段使いのメールソフトで、メールサーバにたまっているメールを読み出しておくといいでしょう。

 SMTPのときにも説明しましたが、プロバイダによっては、外部からPOP3サーバを禁止している場合があると思われます。そういった制限を避けるため、プロバイダのメールサーバで試してみるときには、そのプロバイダの回線を使うことをオススメします。

 さて、接続です。TeraTermなどのTelnetソフトを使って、POP3サーバに接続します。POP3のポート番号は110番です。図3に、そのときの様子を示しました。

+OK hello from popstar POP3サーバに接続
USER fukunaga
+OK password required.
PASS 1xtApGTd&
+OK maildrop ready, 1 message (986 octets) (21698 6291456)
ユーザーの認証
LIST
+OK 1 message (986 octets)
1 986
.
メール一覧の取得
RETR 1
+OK 986 octets
Received: from outgoing.foobar.jp (10.0.1.150)
  by smtp.atmarkit.co.jp with SMTP; 17 May 2003 13:20:43 +0900 (JST)
Received: from [192.168.1.69] by outgoing.foobar.jp
      (InterMail vM.4.01.03.31 201-229-121-131-20020322) with ESMTP
      id <20030517042043.HMMI1178.outgoing.foobar.jp@[192.168.1.69]>
      for <fukunaga@atmarkit.co.jp>; Sat, 17 May 2003 13:20:43 +0900
Date: Sat, 17 May 2003 13:20:42 +0900
From: Yamada <yamada@foobar.jp>
To: fukunaga@atmarkit.co.jp
Subject: =?ISO-2022-JP?B?GyRCODU1JCRHJDkkKyEpGyhC?=
Message-Id: <20030517131954.EC00.YAMADA@smtp.foobar.jp>
MIME-Version: 1.0
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
X-Mailer: Becky! ver. 2.05.05

元気ですか? 最近、連絡がないので心配しています。

このメールを読んだら、必ず返信ください。待っています。

山田
.
メール内容の取得
DELE 1
+OK message 1 marked deleted
LIST
+OK 0 messages (0 octets)
.
NOOP
+OK
RSET
+OK maildrop has 1 message (986 octets)
LIST
+OK 1 message (986 octets)
1 986
.
メールの削除や取り消しなど各種の操作
QUIT
+OK server signing off.
接続を終了する
図3 実際のPOP3サーバにTelnetで接続してみると……(ここをクリックすると拡大表示します

 POP3サーバに接続すると、POP3サーバから接続を受け付けたことを示すメッセージが返ってきます。そこですかさずUSER メールボックス名、PASS パスワードを入力します。それぞれに+OKが返ってきたら、次にメールの一覧を見るためにLISTコマンドを入力します。返ってきた結果を見ると、メール番号1として986バイトのメールが1通あることが分かります。

 ではメールを読み出してみましょう。RETR 1と入力します。この“1”はLISTコマンドで確認したメール番号です。すると、メールサーバにたまっていたメールのヘッダと本文が表示されるはずです。メールソフトはこうやってメールを読み出しているんですね。一度読み出したメールは、もうサーバ上に置いておく必要がありませんから、サーバ上から削除するよう、削除マークを付けます。DELE 1がそのためのコマンドです。削除マークを付けた後でLISTコマンドを送ると……、ほら、メール数がゼロになり、もう読めるメールがないといってきました。

 へそ曲がりの筆者の場合、何もしないコマンドNOOPの次には、RSETを入力してみました。これはDELEで付けた削除マークをクリアするコマンドです。RSETの後に、再びLISTコマンドを入力すると、またサーバ上にメールが1通あることを知らせるメッセージが返ってきました。話として聞いたとおりに動作してくれてひと安心です。では、最後にQUITを入力してください。POP3サーバへの接続が終わります。

 メールをつかさどる2つのプロトコルSMTPとPOPはいかがだったでしょうか。このページで説明し切れなかった、より高度で複雑な機能もまだたくさんありますので、興味のある方はぜひ勉強してみてください。次回『器用な2刀流、FTPでファイル転送!』ではファイルを転送するためのプロトコル「FTP」を取り上げます。



Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。