3 Minutes NetWorking
No.79

3Minutes NetWorking

第79回SMTP(2) SMTPの動作

■ SMTP

インター博士

さてさて、ネット君。メールシステムというものの概略がわかったと思うが。

ネット助手

え〜っと、MTAとMUA。「メールを送る」と「メールを取りにいく」でしたよね。

インター博士

そうだな、前回使った図だとこうなるな。

SMTPとPOP/IMAP

[Figure78-09:SMTPとPOP/IMAP]

ネット助手

そうそう、SMTPとPOP/IMAP。

インター博士

今回はその「送る」と「取りに行く」のうち、「送る」の説明をしよう。
まぁ、メールシステムのうちでもメインの部分と言っていいだろう。

ネット助手

「送る」…SMTPでしたっけ?
しんぷるめーるとらんすふぁーぷろとこる。簡単メール転送プロトコル?

インター博士

なんとも直接的な訳だが、まぁ、その通り。プロトコル自体はいたってシンプルだ。
だからこそ、実装面は大変だという話もあるが、それは置いておくとして。

ネット助手

そうなんですか?

インター博士

まぁな。ともかく、「メールを送る」ためのプロトコルがSMTPだ。

ネット助手

はい。

インター博士

つまり、SMTPクライアント、まぁMUAもしくはMTAのことだが、このクライアントからSMTPサーバであるMTAへメールを送る時に使われるわけだ。

ネット助手

クライアントとサーバ。
MUAとMTA。

インター博士

さっきの図をもう一度見てもらってわかるとおり、メールを受け取ったMTAはそれが自身が持つメールボックス宛ならば、メールボックスへ内部配信する。他のサーバ宛ならば、中継するという動作を行うわけだ。

ネット助手

内部配信?

インター博士

まぁ、「サーバが保有するメールボックスへ送る」という「配信」を行う、ということだな。
SMTPの場合、外部へ送るのを「転送」。内部の自分自身のメールボックスへ送るのを「配信」ということが多いな。

ネット助手

ははぁ、転送と配信。

インター博士

まぁ、簡単に言うとこんな感じかな。

ネット助手

ん、ん〜っと、さっきの図でいうと、まずユーザが使ってるMUAが、MTAへメールを送るわけですね?

インター博士

そうだな。MUAがSMTPクライアント、MTAがSMTPサーバになるな。

ネット助手

で、メールを受け取ったMTAが、メールボックスのあるMTAへメールを送る?

インター博士

うむ。今度は最初にメールを受け取ったMTAがSMTPクライアント、メールボックスのあるMTAがSMTPサーバになる。

ネット助手

ははぁ、MTAはクライアントになったり、サーバになったりするわけですね。

■ SMTPコマンドとレスポンス

インター博士

さて、SMTPクライアント、SMTPサーバの動作をだが。
この動作(メール転送プロセス)は、いままででおなじみのものだ。

ネット助手

おなじみ?

インター博士

うむ。クライアントからのコマンドと、それに対するレスポンスという形でやりとりされるわけだ。

ネット助手

あ〜、確かにおなじみかも。FTPやHTTP、DNSもそうでしたよね。

インター博士

そして、これまたおなじみのASCIIにより、文字列でコマンド・レスポンスをやりとりするわけだ。
まず、使用されるコマンドの代表的なものは次の通り。

HELO接続確認
EHLO接続確認。HELOの拡張版
MAILメールの送信元
RCPTメールの宛元
DATAメール本文
QUIT切断

[Table79-01:代表的なSMTPコマンド]

インター博士

これらのコマンドに対して、サーバはレポンスを返す。
レスポンスは3桁のレスポンスコードと、文字列からなる。まず、レスポンスコードコードの意味。

1xx肯定先行動作は正常であり、現在動作中なため次のレスポンスを待つ必要がある。
2xx肯定完了動作は正常に完了した。
3xx肯定中間正常な動作であり、さらに新しいコマンドで新たな情報を送る必要がある。
4xx一時否定完了コマンドが受理されなかった。エラー原因は一時的なものであるため、再送が必要。
5xx否定完了コマンドが受理されなかった。エラー原因は恒久的なものであるので、修復してから再送する必要がある。

[Table79-02:レスポンスコード・100番台]

x0x構文コマンドは構文エラーである。
x1x情報状態やヘルプなどの情報要求への応答。
x2xコネクションコネクションに関する応答。
x3x認証・アカウントログインとアカウントに関する応答。
x5xメールシステムサーバのメールシステムに関する応答。

[Table79-03:レスポンスコード・10番台]

ネット助手

あ〜これ、みたことありますよ。FTPの時にも出てきた。

インター博士

む。よく気づいたな。第58回でFTPで同じことを確かに説明した。
実を言うと、レスポンスコードはFTPもSMTPも意味は同じなのだ。

ネット助手

え? あれ? ほんとだ。「x5x」が「メールシステム」になっている以外、あとは全く同じだ。
博士、コピー&ペーストしましたね?

インター博士

レスポンスコードの各桁の意味は、FTP、HTTP、SMTPみんな同じなのだよ。別にコピー&ペーストでもいいだろう?
代表的なレスポンスコードとその意味は、次のようになる。

220準備完了・受信確認応答
221切断
250コマンド正常実行
354メール本文を入力待ち
421メールサービスの使用不可による切断
500構文エラー
501パラメータエラー
502コマンドを利用できない
550宛先メールボックスがない
551ユーザが存在しない

[Table79-04:代表的なレスポンスコード]

インター博士

まぁ、このようなコマンドとレスポンスをやりとりして、メールを転送していくわけだな。

ネット助手

なるほど。

インター博士

では、どのようなやりとりをするかといえば。

[Figure79-01:SMTPの動作]

ネット助手

HELO、MAIL、RCPT、DATA、QUITの順?

インター博士

そうだな、その順だ。

ネット助手

で、DATAがメール本文で。最後に「.(ドット)」だけ送るとおしまい、と。

インター博士

そうなる。
もし、複数の宛先に同じメールを送る場合、「RCPT」を何回か送ることになる。

ネット助手

メールの宛先に複数指定した場合ですね?
その場合、サーバはどうするんですか?

インター博士

メールメッセージをコピーして、複数のサーバ宛に送ることになる。
さて、実際にSMTPで送ってみた場合を見てもらおう。

ネット助手

へへぇ、どうやってですか?

インター博士

それはお約束のTelnet接続に決まっている。
メールサーバは「サッポロワークス」の「BlackJumboDog」だ。 ▼ link

SMTPの動作

[Figure79-02:SMTPの動作]

インター博士

まぁ、見てわかるとおもうが、赤がサーバのレスポンス、青がクライアントのコマンドだ。

ネット助手

へ〜。さっきの通りですね。

インター博士

当たり前だ。この受け取ったメールをサーバは自分のメールボックス宛ならば内部配送し、他サーバ宛ならば自身がクライアントとなって転送するわけだな。

ネット助手

なるほどです。

インター博士

あと、話しておくことがあるとすれば。
そうだな、ネット君。さきほどのコマンド一覧でEHLOというのがあったろう?

ネット助手

ありましたね、EHLO。「接続確認。HELOの拡張版」だそうですが。
拡張版?

インター博士

SMTPを時代の要求にしたがって拡張したものがESMTPだ。
ESMTPではSMTPで使えなかった拡張コマンドが使用できるようになっている。

ネット助手

へぇ、どんな拡張です?

インター博士

例えば、認証、送信ファイルサイズ、暗号化、などの機能が使えるようになる。
サーバにどの拡張機能が使えるかどうか問い合わせるのが、EHLOなのだ。

EHLO

[Figure79-03:EHLO]

インター博士

EHLOを送ると、サーバは自身が使うことのできる拡張機能を通知するわけだ。

ネット助手

ん〜っと、もしサーバがESMPTに非対応だったら?

インター博士

その場合は、「502」のコマンドが使用できないエラーが返って来るので、EHLOではなくHELOを送ればよい。

ネット助手

なるほど。

■ エンベロープとメッセージ

インター博士

SMTPの動作は上記のような形のわけだが。このSMTPで送られるメールについていくつかポイントがある。
まず、SMTPはすべてASCIIコードで行われる。

ネット助手

ははぁ、ASCIIコード。
TELNETやFTPでもおなじみですね。

インター博士

うむ。コマンド、レスポンス、それに送るメール本文もASCIIのみだ。

ネット助手

へ?
あれ? ASCIIって英数字記号の文字コードでしたよね?

インター博士

うむ。英数字記号の7ビット文字コードだ。

ネット助手

ですよね、ですよね。
でも、メール本文って普通に日本語が使えますし、画像ファイルとか添付できますよ?

インター博士

確かにできる。
それは、MIMEと呼ばれる拡張規格があるからだ。

ネット助手

まいむ? 拡張規格?

インター博士

うむ。MIMEについては先の回で話す。
とりあえずは、メールはASCIIコードのみ、と覚えておきたまえ。

ネット助手

む〜、わかりました。

インター博士

それと、現実世界の郵便を模写したメールシステムだが、現実世界の郵便と似たようなところがあるという話はしたな。

ネット助手

でした。というよりそっくりですよね。

インター博士

うむ。なので、メールでも「封筒」と「便箋」というものがある。

ネット助手

封筒? 便箋? メールに?

インター博士

封筒には普通何が書いてある?

ネット助手

郵便番号、住所、あて名。あと、送り元?

インター博士

「郵便番号、住所、あて名」はメールアドレス。「送り元」もメールアドレスだな。
送り先と送信元のメールアドレスがさっきでてこなかったか?

ネット助手

あ〜、MAILとRCPTコマンドで出てきましたね。

インター博士

そうだ。つまり、その部分がエンベロープと呼ばれる。

ネット助手

えんぺろーぶ?

インター博士

違う、エンベロープだ。意味はそのまま「封筒」だ。
一方のメール本文はメッセージだ。DATAコマンド部分だな。

エンベロープとメッセージ

[Figure79-04:エンベロープとメッセージ]

ネット助手

ははぁ、確かにDATAコマンドのメッセージ部分を、それ以外のエンベロープが包んでる形ですね。
封筒みたいに。

インター博士

うむ。MTAはエンベロープに書かれた宛先を見て転送処理をする
メッセージには何がかかれていようが関係ない。

ネット助手

ん?なんか当たり前ですよ?
郵便屋さんは中身はどうあれ、封筒の宛名で手紙を送るって当然でしょ?

インター博士

まぁ、なぜわざわざこんなことを言うかというと、ちゃんと理由がある。
それはメールヘッダの説明をすればわかる。

ネット助手

メールヘッダ?
HTTPヘッダとか、そういうのと同じヘッダですか?

インター博士

そういうことだな。メールヘッダについては次回だ。

ネット助手

はい。

インター博士

もう一度SMTPの動作について、まとめておくと。

SMTPによるメールの転送

[Figure79-05:SMTPによるメールの転送]

インター博士

MUAからSMTPコマンドを使って、MTAにメールが転送される。
MTAはそれが自身のメールボックス宛ならば内部配送し、外部ならば宛先サーバへさらに転送する。

ネット助手

でした。

インター博士

ま、実際SMTPの動作自体はいたって簡単だ。
「Simple Mail Transfer」と呼ばれるだけはある。

ネット助手

う〜ん、そういわれればそうかも。

インター博士

という所で今回は終了。
次回はメールヘッダについて話す。

ネット助手

了解です。 3分間ネットワーキングでした〜♪

BlackJumboDog
サッポロワークスのプロキシサーバソフト。
メインはプロキシサーバだが、他にもHTTP、FTP、メール、DNSなども使える。
使いやすくってとても便利。
ESMTP
[SMTP Service Extensions]
RFC1425で規定された拡張規格。
ただ、RFC1425は現在ではSMTPの現行バージョンと同じRFC2821になっている。
MIME
[Multipurpose Internet Mail Extensions encoding]
エンベロープ
[envelope]
ネット助手ネット君の今日のポイント
  • SMTPはメールの転送を担うプロトコル。
    • SMTPクライアントからSMTPサーバへメールが転送される。
    • メールサーバは受け取ったメールが自身のメールボックス宛ならそこへ保存する(内部配送)。
    • 受け取ったメールが他メールボックス宛ならそこへ転送する(外部転送)。
  • SMTPはクライアントのコマンドと、サーバのレスポンスでやりとりする。
  • メールはASCIIコードしか使えない。
  • メールはエンベロープとメッセージからなる。

3 Minutes NetWorking No.79

管理人:aji-ssz(at)selene.is.dream.jp