電子メールは、1960年代にはすでに何らかの形で存在していた。人々はメインフレームコンピュータ上で様々な方法を用いて互いにメッセージを残していたが、1982年8月に情報科学研究所が簡易メール転送プロトコル(SMTP; RFC 821)を発表するまで、電子メールを送受信するための標準化された方法は提案されていなかった。.
SMTPはARPANET上で急速に普及し、メインフレーム間でメールを転送するために使用されていた、より古く複雑な方式に取って代わりました。そして1982年後半、BSD 4.1cに搭載された初期のメール転送エージェント「Sendmail」によって初めてサポートされました。.
それ以来、このプロトコルは比較的定期的に改訂・拡張されてきましたが、メールを送信するための基本的な仕組みは、おおむね変わっていません。.
このプロトコルはテキストベースのプロトコルであり、当初はバイナリデータの送信に対応していませんでした。しかし、テキストベースであったため、実装や保守が容易でした。 MIME(Multipurpose Internet Mail Extensions)は、SMTPを介してバイナリデータをエンコードして送信するための手段として、1980年代後半に普及しました。今日、SMTPはインターネット上で電子メールを送受信するための主要なプロトコルとなっており、このプロトコルに関する知識は、あらゆるネットワーク管理者にとって不可欠です。.
SMTPはテキストベースであるため、このプロトコルの習得は他の多くのプロトコルに比べてはるかに容易であり、SMTPサーバーと直接通信するには、Telnetなど、TCP/IPのポート25を介してASCIIデータを送信できるプログラムさえあれば十分です。.
メールはSMTPを介してトランザクション単位で送信されます。つまり、メッセージの送信が完全に完了せず、エラーも発生しなかった場合、そのメッセージは破棄されます。 RFC 821 では、トランザクションは「送信者の指定」、「1人以上の受信者の指定」、そして「メッセージ自体の送信」という3つの段階から成ると説明されています。しかし、SMTPトランザクションは5つの段階として考える方が分かりやすいでしょう:
- 握手
- 返信先アドレスを送信
- 受信者へ送信
- メッセージデータを送信
- 取引を終了する
握手
ポート25のSMTPサーバーに接続すると、メッセージの送信者は、受信側が接続を受け入れ、以下の形式で自身を識別するまで待機しなければなりません:
220 [ドメイン] [サービス情報]
例:220 example.com サービス利用可能
その後、送信者はHELOコマンドを使用して、受信者に対して自身の身元を明示しなければなりません。.
HELO [ドメイン]
例:HELO example.com
メールサーバーは、各サーバーがドメイン名を使用して自身を識別することを期待しており、このドメイン名を用いてMXレコードの検索を行い、サーバーの身元を確認することができます。ただし、受信サーバーは、たとえ送信者の身元を確認できなかったとしても、この段階では接続を拒否してはならず、次のように応答しなければなりません:
250 [メッセージ]
例:250 example.com example.comのボブさんへ
応答コード 250 は、直前の処理が正常に完了したことを示す、SMTP サーバーからの一般的な「OK」応答です。.
返信先住所:
2つのサーバー間でハンドシェイクが完了すると、SMTPトランザクションが開始され、サーバーへのコマンド送信を開始できるようになります。サーバーがサポートしているコマンドを確認したい場合は、HELPコマンドを送信してください。SMTPサーバーは、サポートされているコマンドを詳述したメッセージで応答するはずです。.
ただし、このサーバー上のユーザーにメッセージを送信するには、まず返信先アドレスを設定する必要があります。SMTP通信中にエラーが発生した場合、そのエラーをこのアドレスに通知できるようにするため、返信先アドレスを最初に指定しておく必要があります。これを行うには、「MAIL FROM:」コマンドを使用します:
送信元:
例:MAIL FROM:
「」の記号に注意してください。RFC 821では、これらの中にメールアドレス自体を含めることが必須とされています。アドレスが有効であれば、SMTPは「250 OK」という応答を返します。.
受信者へ送信
返信先アドレスを設定することで、SMTP を使用してメッセージの受信者を特定できるようになります。これを行うには、「RCPT TO:」コマンドを使用します。
RCPT 宛先:
例:RCPT TO:
複数の受信者を設定するには、受信者ごとにこのコマンドを繰り返してください。受信者がこのユーザーのメールを受け入れる設定になっており、かつその時点でメッセージを受け入れることができる場合、250 OKという応答が返されます。 ただし、このユーザーへのメールの受信が許可されていない場合は、550 failure 応答または適切なエラーコードが返されます。250 OK 応答を受け取った場合は、メッセージデータの送信に進むことができます。.
メッセージデータを送信
SMTP 経由でのデータ送信は比較的簡単ですが、メッセージの形式はかなり複雑になる場合があります。特にバイナリ形式の添付ファイルを送信する場合はなおさらです。データ送信を開始するには、「DATA」コマンドを発行する必要があります。これに対し、サーバーは 354 中間応答を返すはずです。例えば:
354 メッセージを入力し、最後の行を「。」だけで終わらせてください
送信できる最もシンプルなメッセージは、マルチパートMIMEメッセージ形式を使用する必要のないプレーンテキストメッセージです。プレーンテキストであるかどうかにかかわらず、すべてのメッセージは、ピリオド(.)のみを含む行を送信することで終了します。また、メッセージを送信する前に、Date、Subject、To、Cc、Fromなどのヘッダー情報を送信することもできます。.
例:
データ
354 メッセージを入力し、最後の行を「。」だけで終わらせてください
件名:これは計画に関するテキストメッセージの件名です
そして、これがプレーンテキストメッセージの本文です。.
受信が承認されると、SMTPサーバーは「250 OK」という応答を返します。一方、トランザクションが失敗した場合や不完全だった場合は、エラーコードが返されます。メッセージ本文の行末にあるピリオド(.)に注目してください。サーバーがデータの受信を停止するのは、行にピリオドが単独で含まれている場合のみです。 送信元サーバーが、データセッションを早期に終了させる原因となるメッセージ(行にピリオドが1つだけ含まれているメッセージ)を送信する場合は、その行にピリオドをもう1つ追加する必要があります。.
取引の終了
この時点までは、受信側のSMTPサーバーに送信されたすべてのデータは、破棄可能とみなされます。 接続が切断される前に「QUIT」コマンドが送信されない場合、宛先サーバーは保存されていたメッセージデータを単に削除します。もともとは接続を円滑に切断するための方法として使用されていましたが、現在ではトランザクションの完了を示すために一般的に使用されており、多くのメールサーバーは、メッセージ転送エージェント(MTA)がメールをルーティングするためのキューに入れる前に、QUITコマンドを待機しています。 QUIT コマンドを送信すると、宛先サーバーは 221 応答を送信し、トランザクションが完了し、接続が閉じられることを確認します。.
SMTPプロトコルについて学習している場合は、RFC 821、2476、および2554を読むことをお勧めします。特にRFC 821を読む際には、1982年以降、スパマーによる悪用への対応などを背景に、電子メールサーバーが大幅に変更されてきたことを念頭に置いておく必要があります。.
