システムプログラム（第6週）: 


# システムプログラム（第6週）: ＴＣＰ／ＩＰ、ＳＭＴＰ

筑波大学 システム情報工学研究科
コンピュータサイエンス専攻, 電子・情報工学系
新城 靖
<yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~syspro/2011/2011-06-01/smtp.html
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~syspro/2011/
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 クライアントとなり、電
子メールを転送する。表６に、SMTPで定義されている要求、表７に応答を示す。

表６　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
接続を切る。

表７ 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 では、２つのプログラム
が対話をして、電子メールを転送する。

上の対話には、現われていないが、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 コマンドは、次のように３つの引数を与えて利用するものとする。

% ./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)に注意
しないさい。

RFC821 Simple Mail Transfer Protocol(1982)
RFC2821 Simple Mail Transfer Protocol(2001)

Last updated: 2011/05/29 23:02:25