筑波大学 システム情報系 情報工学域 新城 靖 <yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
https://www.coins.tsukuba.ac.jp/~syspro/2024/2024-07-03/smtp.html
あるいは、次のページから手繰っていくこともできます。
https://www.coins.tsukuba.ac.jp/~syspro/2024/
http://www.coins.tsukuba.ac.jp/~yas/
表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以下に、SMTP で電子メールが出される様子を示している。というドメインで要求受け付け可能である。 250 そのアドレスへのメールは、受け付け可能である。 251 そのアドレスは、ローカルには受取人がいない。 354 メールの本文を送れ。終わりは、<CRLF>.<CRLF>。 -------------------------------------------------------------------- 421 サービス利用不可。 450 メールボックスがない。 452 ファイルシステムの空きがない 500 文法エラー。コマンドが認識できない。 501 文法エラー。引数がない。 554 一連の処理に失敗した。
$ telnet violet04.coins.tsukuba.ac.jp smtp
Trying 2001:2f8:3a:1711::231:87...
Trying 130.158.231.87...
Connected to violet04.coins.tsukuba.ac.jp.
Escape character is '^]'.
220 violet04.coins.tsukuba.ac.jp ESMTP Postfix
HELO azalea16.coins.tsukuba.ac.jp
250 violet04.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 1209181E870E
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
$
太字になっている部分が、SMTPの要求(クライアントが送信したも
の)であ。数字で始まっている所が、受信側の violet04.coins.tsukuba.ac.jp
で
動作しているサーバの応答である。このように、SMTP では、2つのプログラム
が対話をして、電子メールを転送する。
上の対話には、現われていないが、DATA
の後に
電子メールの本文が送られている。ここで本文には、
From:
, To:
, Subject:
など
のヘッダも含まれている。
本文の From:
や To:
は、電子メールの転送に
は使われない。
転送には、表?に出てくるMAIL
FROM:
や RCPT TO:
に続くアドレスが使われる。この、
SMTP
のレベルの、配送に使われるデータを、本文と区別して
封筒
(envelope)
と呼ぶ。
SMTP で DATA
の中に出てくるTo:
と、
RCPT TO:
は、多くの場合一致している。しかし、メーリン
グ・リストのメールや、.forward で転送されたメールでは、一致して
いない。すなわち、メーリング・リストや.forward がうまく働くのは、
封筒に書かれた宛先が使われていることによる。
telnet を使って、電子メールを送るサーバに接続して、SMTPのコマンドを打ち 込み、電子メールを送ってみなさい。SMTP の定義は、RFC821 というドキュメ ントにある。DATA は、From: や To: 行を含めることを忘れないようにしなさ い。
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)に注意 しないさい。