Sendmail


MTAとMUA

E-mail システムにおいて、 「ユーザが操作する部分」を MUA (Mail User Agent) と, 「実際に配送を行う部分」を MTA (Mail Transport Agent)と 言うことがあります。

たとえば、Windowsにおける Outlook や Netscape mailなどは MUA 用のアプリケーションプログラムですし、 また、今回説明する sendmail などは MTA のプログラムであると 言えます。

sendmailの動作

E-mailを他のホストへ送ったり、他のホストから受け取ったりするのは sendmail というプログラムです。

sendmailは senderから受け取ったメイルを解析し、 配送のための経路を決定し、mailer (実際の配送をするプログラム) を選択します。 sendmail.cf は、sendmailの設定ファイルであり、

が記述されています。

実際の mail の配送は、別のプログラム(たとえば uucp 経由の場合は uux、 ローカルホストの場合は /usr/bin/procmail)によって行なわれますが、 現在のsendmailの実装では SMTP (Simple Mail Transfer Protocol) 経由の 場合はsendmailプログラムが直接送っています。

SMTP経由のmailの受け取り

vermeer% telnet compXX 25 ← compXX上のsendmailと会話する
Trying 133.99.10.10...
Connected to compXX.tsuda.ac.jp.
Escape character is '^]'.
220 compXX.tsuda.ac.jp ESMTP Sendmail 8.9.3/8.9.3; Sat, 10 Jun 2000 16:51:05 +0900
HELO vermeer.tsuda.ac.jp               ← ホスト名を名乗る
250 compXX.tsuda.ac.jp Hello vermeer.tsuda.ac.jp [133.99.10.3], pleased to meet you

MAIL FROM: nitta@tsuda.ac.jp            ← 差出人のアドレス (他のホスト)
250 nitta@vermeer.tsuda.ac.jp... Sender ok
RCPT TO: root@compXX.tsuda.ac.jp        ← 受取人のアドレス
250 root@compXX.tsuda.ac.jp... Recipient ok
DATA                                    ← 本文の始まり
354 Enter mail, end with "." on a line by itself
This is a test mail from vermeer to compXX ← 本文(1行目)
.                                       ← 本文の終り
250 QAA00887 Message accepted for delivery
quit                                    ← 会話終了
221 compXX.tsuda.ac.jp closing connection
Connection closed by foreign host.

compXX:/var/spool/mail/root
From nitta@vermeer.tsuda.ac.jp  Sat Jun 10 16:46:14 2000
Return-Path: <nitta@vermeer.tsuda.ac.jp>
Received: from vermeer.tsuda.ac.jp (vermeer.tsuda.ac.jp [133.99.10.3])
        by compXX.tsuda.ac.jp (8.9.3/8.9.3) with SMTP id QAA00887
        for root@compXX.tsuda.ac.jp; Sat, 10 Jun 2000 16:45:55 +0900
Date: Sat, 10 Jun 2000 16:45:55 +0900
From: nitta@vermeer.tsuda.ac.jp
Message-Id: <200006100745.QAA00887@compXX.tsuda.ac.jp>

This is a test mail from vermeer to compXX
vermeer% telnet compXX 25
Trying 133.99.10.10...
Connected to compXX.tsuda.ac.jp.
Escape character is '^]'.
220 compXX.tsuda.ac.jp ESMTP Sendmail 8.9.3/8.9.3; Sat, 10 Jun 2000 16:51:05 +0900
HELO renoir.tsuda.ac.jp                 ← 嘘のホスト名を名乗ってみる
250 compXX.tsuda.ac.jp Hello vermeer.tsuda.ac.jp [133.99.10.3], pleased to meet you
MAIL FROM: nitta@tsuda.ac.jp            ← 差出人のアドレス (他のホスト)
250 nitta@tsuda.ac.jp... Sender ok
RCPT TO: root@compXX.tsuda.ac.jp        ← 受取人のアドレス
250 root@compXX.tsuda.ac.jp... Recipient ok
DATA                                    ← 本文の始まり
354 Enter mail, end with "." on a line by itself
This is a test mail from vermeer to compXX
.                                       ← 本文の終り
250 QAA00909 Message accepted for delivery
quit                                    ← 会話終了
211 compXX.tsuda.ac.jp closing connection

compXX:/var/spool/mail/rootへの追加
From nitta@tsuda.ac.jp  Sat Jun 10 16:53:03 2000
Return-Path: <nitta@tsuda.ac.jp>
Received: from renoir.tsuda.ac.jp (vermeer.tsuda.ac.jp [133.99.10.3])
        by compXX.tsuda.ac.jp (8.9.3/8.9.3) with SMTP id QAA00909
        for root@compXX.tsuda.ac.jp; Sat, 10 Jun 2000 16:52:03 +0900
Date: Sat, 10 Jun 2000 16:52:03 +0900
From: nitta@tsuda.ac.jp
Message-Id: <200006100752.QAA00909@compXX.tsuda.ac.jp>

This is a test mail from vermeer to compXX

sendmailの処理

  1. メイル配送先のアドレスを取り出します。 (配送先のアドレスはSMTPのRCPTコマンドで与えられます)。
  2. アドレスがaliasを用いている(/etc/aliasesに記述されている)場合は それを本来のアドレスに戻します。 (メイリング・リストだと複数のアドレスになります。 また転送されている場合はforward先のアドレスに直します)。
  3. 取り出したアドレスの文法的なチェックを行ないます。
  4. メイルのヘッダを取り出してメモリに格納し、さらにメールの本体を 一時的にファイルに書き出します。
  5. 取り出したアドレスを元に実際の転送をするmailerを選択し、 それを起動します。 このとき、メイルの先頭に必要な変更(Received:を付加するなど)を行います。 mailerは配送を試みて実行結果をexit statusで返します。
  6. sendmailはmailerのexit statusを調べます。 エラーが起きればsenderにエラーを返しますし、また、 送られてなければしばらく待ってから再送を試みます。

sendmailの起動オプション

主要なものだけ載せておきます。

sendmailの使用するファイル

alias(別名)

/etc/aliasesで別名を記述します。


aliasname: address[,address]

これはaliasnameが「別名」で、(単数または複数の)address に展開されることを表わしています。 aliasはネストできるのでaddressが別のaliasであっても構いません。


owner-aliasname: address

aliasname宛てのメイルにエラーが起きたとき、 そのエラーメッセージは owner-aliasnameに書かれている addressに送られます。 メイリング・リストにおいて有用な機能です。


aliasname:  :include:pathname

aliasname宛てのメイルは、pathnameファイル中に 書かれているアドレス群に展開されます。

/etc/aliasesの例
Postmaster: root
nobody: root
root: nitta
staff: nitta,ogawa@tsuda.ac.jp,kishi@tsuda.ac.jp

/usr/spool/mqueue (配送に使われるファイル群)

sendmailは一時ファイルや、再送待ちのメイルの情報を /usr/spool/mqueue に置きます。 各ファイルは、先頭の2文字がファイルの種類を表わし、 その後に続く番号が処理番号(ID)を表わしています。

参考のため、compXX.tsuda.ac.jpからnitta@klimt.tsuda.ac.jpに "test from compXX to klimt" という内容のメイルを送った場合の mqueue の内容を載せておきます。
dfPAA07229
test from compXX to klimt


qfPAA07229 (xfPAA07229がある状態)
V2
T928737150
K0
N0
P30057
I3/2/117011
Fb
$_root@localhost
Sroot
RPFD:nitta@klimt.tsuda.ac.jp
H?P?Return-Path: 
HReceived: (from root@localhost)
        by compXX.tsuda.ac.jp (8.9.1/8.9.1) id PAA07229
        for nitta@klimt.tsuda.ac.jp; Mon, 7 Jun 1999 15:32:30 +0900
H?D?Date: Mon, 7 Jun 1999 15:32:30 +0900
H?F?From: root 
H?x?Full-Name: root
H?M?Message-Id: <199906070632.PAA07229@compXX.tsuda.ac.jp>
HTo: nitta@klimt.tsuda.ac.jp
.


qfPAA07229 (xfPAA07229が消えた状態)
V2
T928737150
K928737200
N2
P120057
I3/2/117011
MDeferred: No route to host
Fb
$_root@localhost
Sroot
RPFD:nitta@klimt.tsuda.ac.jp
H?P?Return-Path: 
HReceived: (from root@localhost)
        by compXX.tsuda.ac.jp (8.9.1/8.9.1) id PAA07229
        for nitta@klimt.tsuda.ac.jp; Mon, 7 Jun 1999 15:32:30 +0900
H?D?Date: Mon, 7 Jun 1999 15:32:30 +0900
H?F?From: root 
H?x?Full-Name: root
H?M?Message-Id: <199906070632.PAA07229@compXX.tsuda.ac.jp>
HTo: nitta@klimt.tsuda.ac.jp
.


SMTPによる配送

DNS では「(ホストの)名前」から「IPアドレス」の情報(A)を引く ために使われますが、実は、それ以外の情報も調べることができます。

ある「名前」に関して DNSサーバに以下のタイプを問い合わせできます。

A1IPアドレス
NS2ネームサーバ
CNAME5エリアスの正式名 (Canonical Name)
PTR12ドメイン名のポインタ
HINFO13ホスト情報
MX15メール・エクスチェンジャ
AXFR252ゾーン転送の要求
*255全てのレコードを要求

メイルの宛先の「マシン名」や「ドメイン名」がわかると、 sendmailはDNSサーバにMXを問い合わせて、その結果得られた マシンにメイルをSMTPで送りつけます。