システムプログラム(第6週): TCP/IP、SMTP


電子・情報工学系/システム情報工学研究科CS専攻
新城 靖
<yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2007/No6_files/smtp.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2007/
http://www.coins.tsukuba.ac.jp/~yas/

SMTP

SMTP (Simple Mail Transfer Protocol) とは、電子メールの転送を行うため のプロトコルである。このプロトコルは、MTA (Mail Transfer Agent) と呼ば れるプログラムの間で電子メールを配送したり、MTA と MUA (Mail User Agent) と呼ばれるプログラムの間で電子メールを差し出す時に使われる。MTA の例としては、UNIX 上で動作するsendmailと呼ばれるプログラムがあげられ る。MTA は、一方が SMTP サーバ、もう一方が SMTP クライアントとなり、電 子メールを転送する。表6に、SMTPで定義されている要求、表7に応答を示す。

表6 SMTPで定義されている手続き


MAIL FROM:<reverse-path>
	新しいメールの転送を開始する。
	<reverse-path>は、エラーが起きた時の送り返し先のアドレス。


RCPT TO:<forward-path>
	メールの送り先として <forward-path> を指定する。

DATA
	メールのデータを送り始める。

VRFY	<login-name>
	メールの受け手を確認する。

EXPN	<ml-name>
	メーリング・リストの受取人を表示する。

SEND FROM:<reverse-path>
	メールを転送する。

HELO <domain>
	最初に接続した時に自分自身を相手に知らせる。

QUIT
	接続を切る。

表7 SMTPの応答コード

コード	説明
--------------------------------------------------------------------
220	 というドメインで要求受け付け可能である。
250	そのアドレスへのメールは、受け付け可能である。
251	そのアドレスは、ローカルには受取人がいない。

以下に、SMTP で電子メールが出される様子を示している。
% telnet orchid-nwc smtp [←]
Trying 130.158.86.206...
Connected to orchid-nwc.coins.tsukuba.ac.jp.
Escape character is '^]'.
220 orchid-nwc.coins.tsukuba.ac.jp ESMTP Postfix
HELO azalea20.coins.tsukuba.ac.jp[←]
250 orchid-nwc.coins.tsukuba.ac.jp
MAIL From:<yas@coins.tsukuba.ac.jp>[←]
250 Ok
RCPT To:<yas@is.tsukuba.ac.jp>[←]
250 Ok
DATA[←]
354 End data with .
From: yas@coins.tsukuba.ac.jp[←]
To: yas@is.tsukuba.ac.jp[←]
Subject: hello[←]
[←]
body[←]
.[←]
250 Ok: queued as C150F164511
QUIT[←]
221 Bye
Connection closed by foreign host.
% []

太字になっている部分が、SMTPの要求(クライアントが送信したも の)であ。数字で始まっている所が、受信側の orchid-nwd で 動作しているサーバの応答である。このように、SMTP では、2つのプログラム が対話をして、電子メールを転送する。

上の対話には、現われていないが、DATA の後に 電子メールの本文が送られている。ここで本文には、 From:, To:, Subject: など のヘッダも含まれている。

本文の From:To: は、電子メールの転送に は使われない。 転送には、表?に出てくるMAIL FROM:RCPT TO: に続くアドレスが使われる。この、 SMTP のレベルの、配送に使われるデータを、本文と区別して 封筒 (envelope) と呼ぶ。

SMTP() で DATA の中に出てくるTo: と、 RCPT TO: は、多くの場合一致している。しかし、メーリン グ・リストのメールや、.forward で転送されたメールでは、一致して いない。すなわち、メーリング・リストや.forward がうまく働くのは、 封筒に書かれた宛先が使われていることによる。

★ telnetによるメール発信

telnet を使って、電子メールを送るサーバに接続して、SMTPのコマンドを打ち 込み、電子メールを送ってみなさい。SMTP の定義は、RFC821 というドキュメ ントにある。DATA は、From: や To: 行を含めることを忘れないようにしなさ い。

★ SMTPクライアントの作成

SMTPサーバに対して、電子メールを発信するプログラムをつくりなさい。その プログラムの名前を、smtpput とする。

mverify コマンドは、次のように3つの引数を与えて利用するものとする。

% ./smtpput host from@coins.tsukuba.ac.jp to@coins.tsukuba.ac.jp < mail-data [←]
ここで、host は、SMTPサーバ(sendmailデーモン)が動いているホストの名前 である。from@coins.tsukuba.ac.jp は、SMTP の MAIL FROM: で与えるアドレス(自分自身のアドレス)である。 to@coins.tsukuba.ac.jp には、SMTP の RCPT To: で指定する受取人のアドレスを指定する。実験では、これも自分自身のアドレ スを使う。

電子メールの本文は、標準入力(キーボード、または、ファイルやパイプ)から 与える。

DATA には、次のようなデータを指定する。

DATA
From: from@coins.tsukuba.ac.jp
To: to@coins.tsukuba.ac.jp

本文
.
本文は、標準入力(上の例では、mail-data という名前のファイル)から受け取 る。

プログラムをつくる時には、行末の扱い(CR-LF)に注意 しないさい。

参照


Last updated: 2007/05/22 13:10:47
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>