メールシステムの管理

アドレス書き直しルール

この節では、書き直しルールとメールプログラムの記述について詳細に説明します。

特殊マクロ、条件文

特殊マクロはコンストラクト $x を使って参照されます。x は一致 (LHS) または挿入 (RHS) されるマクロの名前です。小文字の英字は、特定のセマンティクスに使用され、特殊文字には、条件文に使用されるものもあります。

sendmail に情報を送信するには、表 3-9 に示すマクロを定義する必要があります。

表 3-9 必要とされる sendmail マクロ

マクロ 

説明 

$a

ARPANET フォーマットでの開始日付 

$b

ARPANET フォーマットでの現在の日付 

$c

ホップカウント 

$d

UNIX (ctime()) フォーマットでの日付

$e

SMTP が起動したとき印刷される 

$f

発信者 (from) 名 

$g

受信者へ送信する発信者名 

$h

受信者ホスト 

$i

待ち行列 ID 

$j

このサイトの公式ドメイン名。$e マクロの最初の単語であり、$j はドメイン名のフォーマットである必要がある

$k

UUCP ノード名 (uname から) 

$l

UNIX の From 行のフォーマット

$m

gethostname 戻り値のドメイン部分

$n

デーモン名 (エラーメッセージ用) 

$o

トークンとみなされる文字のリスト 

$p

sendmail のプロセス ID

$q

発信者アドレスのデフォルトフォーマット。メッセージの作成時にメッセージ上の発信者の表現方法を指定する 

$r

使用するプロトコル 

$s

発信者のホスト名 

$t

現在の時間の数値表 

$u

受信者ユーザー 

$v

sendmail のバージョン数

$w

このサイトのホスト名 

$x

発信者のフルネーム 

$z

受信者のホームディレクトリ 

$-

発信者アドレス 


注 -

SunOS 4.x リリースでは、$w は、ホストの完全指定名です。Solaris 2.6 リリースでは、$w は、ホストの短縮名です。


以下に例を示します。

De$j Sendmail $v ready at $b
DnMAILER-DAEMON
DlFrom $g $d
Do.:%@!^=/ Dq$g$?x ($x)$.
Dj$H.$D

特殊な状況でないかぎり、これらのマクロのいずれも変更する必要はありません。たとえば、バナーを定義する最初の行をセキュリティの目的で変更することあります。最後の 2 行を変更して複数のホストを 1 つのホストのようにすることもあります。

$q マクロを変更して次のように指定できます。


$?x$x $.<$g>

これらは、次の 2 つのフォーマットに対応します。


doe@acme.com (John Doe) 
John Doe <doe@acme.com>

マクロによっては、メールプログラムの引数または他のコンテクストに使用する sendmail によって定義されるものもあります。これらのマクロを表 3-10 に示します。

表 3-10 別の sendmail マクロ定義

マクロ 

説明 

$m

ドメイン名 

$p

sendmail プロセス ID

3 種類の日付を使用できます。$a$b マクロは ARPANET フォーマットです。$a は (もしあれば) メッセージの Date: 行から抽出される時刻で、$b は (ポストマークに使用される) 現在の日付と時刻です。Date: 行が着信メッセージで見つからなければ、$a には現在の時間が設定されます。$d マクロは UNIX (ctime) フォーマットの $a マクロと等価です。

$f マクロは、最初に判別された発信者の ID です。「特定のホスト」にメールされたメッセージに対しては、$g マクロは「受信者に対応する」発信者名に設定されます。たとえば、発信者 eric がマシン ucbarpa から bollard@matisse にメッセージを送信する場合、$f の値は eric$g の値は eric@ucbarpa になります。

$x マクロは発信者のフルネームに設定されますが、これはいくつかの方法で知ることができます。発信者のフルネームは (ヘッダーの Full-name: 行の値から、または From: 行のコメントフィールドを使用して) フラグとして sendmail に渡すことができます。このフルネームが Full-name: 行からも、From: 行からもわからず、さらに、メッセージの発信源がローカルである場合は、フルネームは /etc/passwd ファイルで検索されます。このフルネームは name 環境変数からも読めます。

メッセージを送信する際、$h$u、および $z マクロには、受信者のホスト、ユーザー、およびホームディレクトリ (ローカルの場合) が設定されます。最初の 2 つのマクロは、書き直しルールの $@$: の部分からそれぞれ設定されます。

$p$t マクロを使用して (たとえば 、Message-Id: フィールドに) 一意の文字列を作成します。$i マクロにはこのホストの待ち行列 ID が設定され、タイムスタンプ行に入れられるとメッセージを追跡するのに便利です。$v マクロは sendmail のバージョン番号になるように設定され、通常タイムスタンプ行に入れられるのでデバッグに非常に便利です。ただし、現在のバージョンに一般的に知られるバグがあった場合、この情報を悪用される可能性があるというセキュリティ上の危険があります。$w マクロには、gethostbyname() および gethostname() によって与えられる、このホストの一次名が設定されます。$c フィールドは「ホップカウント」に設定され、つまり、このメッセージが処理された回数であり、メッセージのタイムスタンプをカウントすることによって決定されます。

$r$s フィールドには、sendmail で通信に使用されるプロトコル、および送信するホスト名に対して設定されます。

次の構文を使って条件文を指定できます。


$?x text1 $| text2 $ 

マクロ $x が設定されている場合は text1 を、それ以外の場合は text2 を挿入します。else (c $|) 節は省略できます。

特殊クラス

クラス $=w は、このホストがわかる名前すべてのセットです。ローカルホスト名を削除するのに使用できます。クラス $=m はドメイン名に設定されます。

アドレス書き直しルールの左側

書き直しルールの左側にはパターンがあります。通常の単語は直接比較のみが行われます。ドル記号は「メタ記号」を意味し、マクロやクラスなど、単純な単語以外のものを一致させます。表 3-11 にメタ記号を示します。

表 3-11 sendmail の左側のメタ記号

記号 

説明 

$*

ゼロ以上のトークンを示す 

$+

1 つまたは複数のトークンを示す 

$-

1 つのトークンを示す 

$=x

クラス x にある任意の文字列を示す

$‾x

クラス x にない任意のトークンを示す

$x

マクロ x を示す

パターンのいずれかが一致すると、右側で置換するため記号 $n に割り当てられます。n は LHS の索引です。たとえば、LHS ルールは、次の入力に適用できます。


$-:$+
JUPITER:eric

ルールは一致し、RHS に渡される値は次のようになります。

$1	JUPITER
$2	eric

Solaris に固有の規則

名前空間で作業するため、幾つかの特殊な規則が追加されています。これらの規則は sendmail では一般的でないので、これを使用できるのは Solaris ソフトウェアを稼働するシステムだけです。

名前空間のホスト情報で、特殊形式 $%y はいずれのホスト名とも対応します。この規則を使用して、ローカルかリモートのホストを対応させることができます。大きな区分から小さな区分へのマルチトークンマッチを行うので、短縮ローカルホスト名とともに、ホストの完全指定名も処理できます。

$%x 形式は DNS により MX レコードと一致させます。これは DNS データベースに A レコードがない場合でも行われます。

$%l はローカルドメインのホストの完全指定名を一致させます。NIS またはローカルのファイルが使用されている場合、名前空間のホスト名にはローカルドメイン名を含めるか、DNS 転送を起動する必要があることを意味します。NIS+ 名前空間はいかなる変更もせずに、ホスト名を適切に指定します。

DNS 転送が設定できず名前空間を変更してホストの完全指定名を使用できない DNS で、NIS 環境の $%l を使用するには、構成ファイルに次の行を追加します。

DAhosts.byname

そして %l の箇所をすべて %A で置換します。A の位置には重複しない文字なら何でも使えます。これでターゲットホストを IP アドレスに対応でき、単独のトークン名である限り、ホストの完全指定名を検索する必要がなくなります。対応付けたすべてのアドレスはローカルとみなされるので、名前空間には、メールドメイン外のいかなるシングルのトークンホストのエントリも含まれていないことを確かめてください。

アドレス書き直しルールの右側

書き直しルールの左側が一致すると、右側で入力が置き換えられます。ドル記号から始めない限り、トークンは右側から直接コピーされ、この場合、マクロとして処理されて展開されます。

表 3-12 に、より複雑な置換のメタ記号を示します。

表 3-12 sendmail の右側のメタ記号

記号 

説明 

$x

マクロ x を展開する

$n

LHS から未定義のトークン n を置き換える。n は数字

$>n

ルールセット n を呼び出す。n は数字

$#mailer

mailer に対する名前解決を行う

$@host

host を指定する

$:user

user を指定する

$[host$]

一次ホスト名にマップする 

${x name$}

NIS マップまたは NIS+ テーブル $x から名前をマップする。マップ名が rev で始まる場合、sendmail は別名を逆にする

$n (n は数字) 構文は、LHS で一致した $+$-$*$‾x から対応する値を置き換えます。これは任意の場所で使用できます。

$>n 構文は、通常行の残りを置換してからルールセット n に渡します。ルールセット n の最後の値は次に (プロシージャまたは関数呼び出しなど) このルールの置き換えになります。

ルールセット 0 では $# 構文だけを使用します。ルールセットの評価はすぐ中断され、sendmail にその名前が完全であることを示します。完全な構文は次のとおりです。


$#mailer$@host$:user

これは、メールプログラムの指示に必要な 3 要素 {mailerhostuser} を指定します。メールプログラムには、さらに多くの処理が行われるものもがあります。たとえば、ローカル名が別名になることがあります。

右辺の前にも $@ または $: を付け、評価を制御できます。$@ プレフィックスにより右辺の残りは値に戻ります。$: プレフィックスによりルールはすぐに終了しますが、ルールセットは続きます。したがって、これは、ルールを 1 回の適用に制限するのに使用できます。両プレフィックスとも、右辺の展開の結果には影響しません。

$@ および $: は、次のように $> 機能の前に置くことができます。


R$+	$:$>7$1

これは、あらゆるものに対応し、それをルールセット 7 に渡し、続行します。$: は無限ループを回避するために必要です。$[host]$ 構文は、ホスト名を「公式」または一次ホスト名に置き換えます。一次ホスト名とは、hosts.byname NIS マップの 1 番目に表示されているホスト名、または NIS を実行していない場合は /etc/hosts の 1 番目に表示されているホスト名です。$[host] 構文はホストの略称を削除するのに使用されます。${x name $} 構文は、マクロ $x で示された nis_map_name の結果により文字列を置換します。

以下の規則をルールセット 0 に追加して、それ自体ではメールをルーティングできない可能性のあるシステム (ルーターなど) から、メールホストにメールを転送できます。


R$*<@$*.$m>		$#ether $@mailhost $:$1<@$2.$m>

書き直しルールのセットのセマンティクス

図 3-2 に示すように、5 つの書き直しセットには固有のセマンティクスがあります。

図 3-2 書き直しセットのセマンティクス

Graphic

ルールセット 3 は、sendmail が名前を処理する前にでも sendmail に適用されます。ルールセット 3 は、名前を次のような基本構文の 1 つの形式に変えます。


local-part@host-domain-spec

@ が指定されていない場合は、発信者名から host-domain-spec を追加できます (C フラグが送信メールプログラムに対応してメールプログラムの定義で設定されている場合)。

ルールセット 0 は、ルールセット 3 の後で、実際に受信者を指定する名前に適用されます。ルールセット 0 では、mailerhostuser の 3 要素を決定しなければなりません。mailer は構成ファイルのメールプログラム定義で定義される必要があります。host は指定されたメールプログラムの引数展開で使用するために $h マクロに定義されます。user$u に定義されます。

ルールセット 1 は、すべての From: 受信者名に適用され、ルールセット 2 は、すべての To: 行と Cc: 行に適用されます。次に、メールプログラムの定義行 (および R=) に指定されたルールセットが適用されます。この処理は、そのメッセージがルールセット 0 によっていくつのメールプログラムに送信されるかに対応して 1 つのメッセージに対して何度も行われます。

ルールセット 4 は、メッセージのすべての名前に対し、最後に適用されます。通常、内部形式を外部形式に変換する場合に使用されます。

error メールプログラム

ルールセット 0 において特殊名 error を持つメールプログラムを使用してユーザーのエラーメッセージを生成できます。ユーザーフィールドは出力されるメッセージです。


$#error$:Host unknown in this domain 

たとえば、次のようなエントリがルールの右側 (RHS) にあるとき、左側 (LHS) が一致すると指定のエラーを生成します。

メールプログラムの記述のセマンティクス

各メールプログラムには、内部名があります。内部名は任意ですが、localprog という名前はそれぞれ 1 番目と 2 番目に定義しなければなりません。ルールセット 0 はこのメールプログラム名 (およびホスト名、ユーザー名) に対する名前を解決します。

P フィールドではメールプログラムのパス名を与えます。このメールプログラムが TCP 接続によりアクセスされる場合、代わりに文字列 [TCP] を使用してください。

F フィールドではメールプログラム用のフラグを定義します。発信者の名前を渡すため、それぞれ f または r フラグのように、f または r フラグを指定します。特定の条件のもとでエラーとなるメールプログラムに対応するために、これらのフラグは、sendmail に渡されたときだけ渡されます。argv テンプレートにおいて f$g を指定できる場合もあります。メールプログラムが root として呼び出され、sendmailroot に対し setuid を実行している場合は、S フラグを使用してください。S フラグでは、メールプログラムを呼び出す前にユーザー ID を再設定しません。このメールプログラムがローカルである (つまり、別のネットワークホップではなく最後の配信を行う) 場合、このフラグを使用してください。s フラグを指定すると、引用符文字 (バックスラッシュおよび二重引用符) は名前から取り除かれます。指定しないと、渡されます。メールプログラムが 1 つのトランザクションで同じホストの複数のユーザーに送信可能な場合は、m フラグを使用します。このフラグがオンならば、$u を含む argv テンプレートはホストの各ユーザーに繰り返されます。e フラグは、「高価」であるとメールプログラムをマークし、sendmail は待ち行列の実行まで接続を延期します。c 構成オプションも設定しなければならないことに注意してください。

C フラグは役に立ちます。メッセージの受信先のメールプログラムではなく、送信元のメールプログラムに適用されます。このフラグをセットすると発信者 (つまり @host.domain 部分) のドメイン指定は保存され、まだドメイン指定を含まないメッセージの名前に追加されます。たとえば、この形式のメッセージは次のとおりです。


From: eric@jupiter 
To: joe@saturn, sam

これは、次のように変更されます。


From: eric@jupiter 
To: joe@saturn, sam@ganymede

ただし、C フラグが、eric@jupiter に対応するメールプログラムで定義される場合に限ります。

メールプログラムの記述における SR フィールドは、それぞれ発信者と受信者名に適用されるメールプログラムごとの書き直しセットです。送信するドメインが追加され、一般的な書き直しセット (番号 1 または 2 のいずれか) が適用された後、これらは適用されますが、出力書き直し (ルールセット 4) よりは先に適用されます。通常、ドメインをまだ持たない名前にカレントドメインを追加するため使用します。たとえば、この形式のヘッダーは次のとおりです。


From: eric@host

これが次のように変わります。


From: eric@host.colorado.edu

または、


From: saturn!eric

これは、送信先のドメインによって異なります。また、これらのセットは、ルールセット 4 と同時に使って特殊な目的の出力の書き直しにも使用できます。

表 3-13 には、構成ファイルで使用可能な追加のフラグを示します。

表 3-13 メールプログラム記述の追加フラグ

フィールド名 

用途 

E

行末を示すために使う文字列を定義する。TCP を使用する場合は、returnnewline を含む文字列がデフォルト。そうでない場合は newline だけで行末を示す。print バックスラッシュエスケープ (/r, /n /f, /b) を使用できる。

A

引数ベクトルテンプレートを指定する。埋め込みスペースがあってもよい。このテンプレートはメールプログラムに渡される前にマクロ展開される。便利なマクロとしては、ルールセット 0 によって解決される名である $h と、(1 つまたは複数) ユーザー名である $u がある。$u とマクロを渡す引数がない場合は、sendmail は SMTP を使ってメールプログラムとやりとりする。このメールプログラムのパス名が TCP である場合は、引数ベクトル TCP $h [port]を使う。ただし port はオプションの接続先ポート番号

L

メールプログラムに渡される $u マクロの最大長を指定する。UUCP メールの効率を高めるには、L フィールドを m フラグと組み合わせて 1 回の呼び出しでメールを複数の受信者に送信できる。この場合、同時にメールプログラムの引数の長さの制限を免れることもできる。$u は、少なくとも 1 人の受信者に対しては必ず展開される。その受信者が L=制限を超えても例外にはならない

たとえば、次の指定は、ローカル配信と Ethernet 配信のメールプログラムを指定します。


Mlocal, P=/bin/mail, F=flsSDFMmnP, S=10, R=20, A=mail -d $u 
Mprog, P=/bin/sh,   F=lsDFMeuP,  S=10, R=20, A=sh -c $u

1 番目のメールプログラムは、local という名前でファイル /bin/mail にあり、F フラグをとります。そしてローカル配信を行い、名前から引用符を削除し、同時に複数のユーザーにメールを配信します。ルールセット 10 をメッセージにおける発信者名に適用し、ルールセット 20 を受信者名に適用します。メッセージに送信する引数ベクトルは、maild、および受信ユーザーの名前を含む単語です。r フラグを挿入する場合は、maild の間に入れます。

2 番目のメールプログラムは ether と呼ばれます。これは TCP 経由で接続され、同時に複数のユーザーを処理できます。接続を延長し、発信者名のドメインをドメインのない受信者名に追加します。ルールセット 11 によってプロセス発信者名を、ルールセット 21 によって受信者名を処理します。このメールプログラムに渡されるメッセージは、100,000 バイトに制限されています。