メールの仕組み(SMTP)

メールソフトを使ったときには、メールの送信と受信では全く別の仕組みが利用されます。 ここでは、そのうちの電子メールをメールサーバに送信する仕組みであるSMTP(Simple Mail Transfer Protocol)について解説したいと思います。

SMTPとは?

SMTPはメールサーバにメールを送信するためのプロトコルです。 SMTPには2つの側面があります。 一つは、一般のユーザが電子メールアプリケーションを利用してメールサーバにメールデータを送信するという使われ方です。 もう一つは、メールサーバから別のメールサーバに対してメールデータを送信するという使われ方です。 前者の側面は普段から利用しているユーザも多く、なじみやすいと思います。 しかし、後者の使われ方は何のことだか良くわからないと思うかもしれません。

まずは、メールソフトからメールサーバにSMTPを使ってメールを送信するだけの場合を説明します。 この場合は非常に単純で、メール送信者はSMTPを使ってメールサーバにメールを送ります。 メール受信者はPOP3などを利用してメールを受け取ります。 この場合、メール送信者とメール受信者が利用するメールサーバは同一でないといけません。 それには、メールアドレスの「@」以降の部分が一緒である必要があります。 (@以下が一緒でなくてもメールサーバが一緒という例もありますが、とりあえずそれは例外ということにします) 例えば、メール送信者のメールアドレスが「user@hogehoga.or.jp」でメール受信者は「abcdef@hogehoga.or.jp」だった場合、このようなSMTPの使われ方になります。

次に、メールサーバからメールサーバに対してSMTPで通信が行われる例を挙げます。 前の例にあったようにメールの送信者と受信者が一緒のドメインであれば簡単でしたが、そうでない場合もいっぱいあります。 多くの人は所属ドメインが異なるメールアドレスに対してメールを送信していますが、メールソフトの「メール送信サーバ」欄に登録してあるSMTPサーバは一つだけではないでしょうか?

何故これでメールが相手に届くかというと、SMTPサーバがメールを転送してくれるからです。 SMTPによるメールの転送はバケツリレーに例えられます。 SMTPサーバは、とりえあず受け取ったメールを最適と思われる次のSMTPサーバに送ります。 メールを受け取ったSMTPサーバは自分宛でなければさらに次のSMTPサーバに送ります。 このような処理が繰り返されてメールは相手に到達します。 これがメールサーバ間で利用されるSMTPです。

SMTPには2つの側面があるという説明をしましたが、プロトコル上は両方とも全く一緒です。 というのも、SMTPでデータを受け取る方のサーバは相手がメールクライアントかメールサーバかはあまり関係ないからです。 SMTPでデータを受け取るサーバが気にするのは自分宛であるかどうかだけです。 自分宛であれば保持しますし、自分宛でなければ転送します。 プロトコル上は全く一緒と言ってしまうと混乱するかもしれませんが、ここで2つの側面として説明したかったのは使われ方です。 SMTPがどのような局面で使われるかという事を何となくわかって頂ければ幸いです。

では、次にSMTPがどのようなプロトコルであるかの説明をしたいと思います。

SMTP仕組み

SMTPはテキストベースの単純なプロトコルでTCPの25番ポートを利用して通信を行います。 SMTPを使ってメールを送信する側は自分が誰であるか名乗って、メールデータを送りつけます。 (勝手に誰であるか名乗れるという所が問題で迷惑メールの温床になっていますが詳細は後述します)

mail.hogehoge.or.jpというメールサーバがあったとして、SMTPプロトコルを手動で話してみるサンプルを示します。 手動で通信を行うにはtelnetを利用するのが良いでしょう。 telnetはWindows、MacosX、Linux、その他UNIX系OSで大抵入っています。 Windowsで使う場合にはコマンドプロンプトをご利用ください。 以下に「telnet mail.hogehoge.or.jp 25」をしたときの例を示したいと思います。 太字で示してるのがユーザが手で入力する部分です。


220 MailServer ESMTP  
HELO myhostname.hogehoge.or.jp
250 myhostname.hogehoge.or.jp
MAIL FROM: username@hogehoge.or.jp
250 OK 
RCPT TO: abcedf@hogehoge.or.jp
250 OK  
DATA
354 End data with .  
To: abcdef@hogehoge.or.jp
Subject: test
From: username@hogehoge.or.jp

test mail

.
250 OK
QUIT
221 BYE

SMTPでは、まず最初に挨拶をしないといけません。 挨拶は「HELO」を利用して行います。 英語で「こんにちは」は「HELLO」ですが、SMTPの命令は「L」が一つ少ないので注意してください。 HELOメッセージでは、自分のホスト名を名乗ります。 大抵はホスト名を適当に名乗っても大丈夫だったりします。

「MAIL FROM」メッセージはメール送信者を指定しています。 「RCPT TO」メッセージは送り先を指定しています。 メール本体のデータは「DATA」命令の後に続けます。 DATA命令を実行した直後はメールヘッダの入力をします。 とりあえず、「To:」「Subject:」「From:」ぐらいを入れれば十分ですが、その他にも必要に応じて色々追加できます。 メールヘッダは改行だけの行を入力すると終わります。 メールヘッダ部分が終わるとメールのデータ部分です。 上記例では、「test mail」とだけ記述しています。 「DATA」命令は「.」(ピリオド)だけの行を入力すると終わります。 DATA命令が終わるとメールがサーバに送られたことになります。

最後に「QUIT」と入力するとSMTPによる通信は終了します。

上記サンプルのような通信を行うと、username@hogehoge.or.jpからのメールとしてabcdef@hogehoge.or.jpにメールが届きます。 メールの内容は「test mail」という文章になります。 このように単純なメールは簡単に送れてしまいます。 いつも使っているメールサーバに対してtelnetで自分宛にメールを送ってみると何と無く実感が持てるかも知れません。

SMTPの詳細はRFC2821に記述されています。 詳細を知りたいかたはRFC2821をご覧下さい。

SMTPを使うときの注意点

普通のSMTPはTCPのコネクションを確立してその上でメールのやりとりを行います。 POP3と同様に、ユーザとメールサーバの間の通信路にパケットを監視している人がいて、 何も暗号化をしていない場合にはTCPによりやり取りされるデータはそのまま中身が見えてしまいます。 SMTPでは、メールの内容などが暗号化されずそのまま流れるため機密やプライバシ情報が第三者に見られてしまう可能性があります。

「通信路に誰かがいるわけがない」と思うかも知れませんが、無線LANなどを使っている場合、無線が届く範囲にいるひとに内容が見られているという可能性もあります。

非常にセキュリティレベルが低いSMTPですが、最近ではSSLでSMTPのTCPセッションを暗号化するなどの方式で第三者に情報を見られてしまうことを防ぐ事ができます。 ただ、通信路の暗号化だけではメールサーバ管理者に勝手にメールを見られてしまう事を防げません。 そのような場合、メールの中身自体を暗号化したりできます。 メールの中身自体を暗号化してしまえば通信路上の第三者も、メールサーバ管理者もメールの内容を知ることは出来ません。

SMTPには「なりすましが容易である」という大きな問題もあります。 この問題があるために、世界中で迷惑メールが大量に出回っています。

前(POP3の仕組み) インターネット入門TOP