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

                                       筑波大学 システム情報系 情報工学域
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2022/2022-06-29/smtp.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2022/
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の応答コード。400番台、500番台はエラー。

コード	説明
--------------------------------------------------------------------
220	 というドメインで要求受け付け可能である。
250	そのアドレスへのメールは、受け付け可能である。
251	そのアドレスは、ローカルには受取人がいない。
354	メールの本文を送れ。終わりは、<CRLF>.<CRLF>。
--------------------------------------------------------------------
421	サービス利用不可。
450	メールボックスがない。
452	ファイルシステムの空きがない
500	文法エラー。コマンドが認識できない。
501	文法エラー。引数がない。
554	一連の処理に失敗した。

以下に、SMTP で電子メールが出される様子を示している。
$ telnet viola6 smtp [←]
Trying 2001:2f8:3a:1711::231:115...
Connection failed: Connection refused
Trying 130.158.231.115...
Connected to viola6.
Escape character is '^]'.
220 viola6.coins.tsukuba.ac.jp ESMTP Postfix
HELO aloe66.coins.tsukuba.ac.jp[←]
250 viola6.coins.tsukuba.ac.jp
MAIL From:<yas@coins.tsukuba.ac.jp>[←]
250 2.1.0 Ok
RCPT To:<yas@cs.tsukuba.ac.jp>[←]
250 2.1.5 Ok
DATA[←]
354 End data with <CR><LF>.<CR><LF>
From: yas@coins.tsukuba.ac.jp[←]
To: yas@cs.tsukuba.ac.jp[←]
Subject: hello[←]
[←]
body[←]
.[←]
250 2.0.0 Ok: queued as 3F3FB1403AF
QUIT[←]
221 2.0.0 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: で指定する受取人のアドレスを指定する。実験では、これも自分自身のアドレ スを使う。

電子メールの本文は、標準入力(キーボード、または、ファイルやパイプ)から 与える。 本文には、次のようなヘッダと本文を含めるものとする。

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

本文
SMTP では、本文を送信する時には、DATA コマンドを用いる。 本文の末尾には「.<CRLF>」を含める。 (厳密には、前の行のから考えると <CRLF>.<CRLF>) もし本文の行の先頭に「.」があれば、「..」に変換して送り、 本文の末尾と区別できるようにする。

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

参照


Last updated: 2022/06/07 15:57:26
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>