この節では、構成ファイルを詳細に説明し、独自のファイルを書くためのヒントを示します。
構文解析は sendmail が起動するたびに行われるため、構成ファイルの構文は解析しやすいものです。ただし、残念ながらこの構文は読みにくいものです。
sendmail は、次の関数に対して 1 文字の英字を使用します。
コマンド行のフラグ
構成オプション
待ち行列ファイルの行タイプ
構成ファイルの行タイプ
メールプログラムのフィールド名
メールプログラム用のフラグ
マクロ名
クラス名
次の節には、構成ファイルの概要とそのセマンティクスについての詳細な説明があります。デフォルトの main.cf ファイルのコピーは、付録 A 「sendmail 構成ファイル」 にあります。
sendmail 構成ファイルは次の 3 つの部分に分かれています。
記号、クラス、オプション、およびパラメータの定義
メールプログラムと配信プログラムの定義
アドレス書き換えのルールを決めるルールのセット
記号、クラス、オプションとパラメータを定義して、sendmail の環境を設定して、オプションを設定していくつかの重要なマクロを定義します。
メールプログラムと配信プログラムを定義することによって、sendmail が正しいプロトコルを使用し、正しい配信プログラムとやりとりできるようになります。
書き換えルールを定義してルールセットにまとめ、別の形式にアドレスを変換します。一般に、ルールセットの各ルールは特定のアドレスに適用されます。アドレスはルールセット内で何度か書き換えられることがあります。
標準のルールセットは 7 つあり、表 3-5 に示す順に適用されます。
表 3-5 ルールセットの適用の順序
ルールセット |
説明 |
---|---|
適用される最初のルールセット。アドレスを local-address@host-domain に変換しようとする |
|
宛先と送信に使用するメールプログラムを判定する。宛先を 3 つ (メールプログラム、ホスト、ユーザー) に処理する |
|
発信者のアドレスを書き換える |
|
発信者アドレスに追加のルールセットを指定し、最後のメールプログラム固有のクリーンアップが可能。これらのルールセットには、各メールプログラムごとに異なる名前がある。たとえば、 S は一般の「発信者 (sender)」を表す |
|
受信者のアドレスを書き換える |
|
受信者アドレスに追加のルールセットを指定し、最後のメールプログラム固有のクリーンアップが可能。これらのルールセットには、各メールプログラムごとに異なる名前がある。この例の R は一般の「受信者 (recipient) 」を表す |
|
通常内部形式から外部形式に、前回のアドレスをすべて書き換える |
ルールセット 0 は内部的な形式に変換される必要があります。この内部形式はメールプログラム記述子へのポインタとして使用されます。メールプログラム記述子は、メールプログラムのインタフェースの必要条件を記述します。
メッセージにある名前の書き換えは、通常、2 つのフェーズで行われます。最初のフェーズは、ルールセット 3 を使用して任意のフォーマットの名前を local-address@host-domain 形式に変換します。第 2 フェーズは、その名をメールプログラムの受信に適した構文の標準形式に変換します。sendmail は 3 つのサブフェーズで名前を書き換えます。ルールセット 1 はすべての発信者の名前に、ルールセット 2 はすべての受信者の名前に適用されます。メールプログラムの定義中にメールプログラム固有のルールセットを指定できます。最後に、ルールセット 4 は、外部形式への変換を行うために適用されます。
RFC 822 では、メールメッセージそのもののフォーマットを説明しています。sendmail はこの RFC に準拠しています。したがって、カスタマイズするには、このマニュアルに説明がある多数の標準的なコードを変更する必要があります。特に次の文字は特殊な意味に解釈されます。
< > () " ¥
RFC 822 特殊文字 < > ( ) " ¥ は、特定の目的に使用してください。かっこ () の中の情報は、コメントまたは個人用です。角かっこ <> の中の情報は local-address@host-domain アドレス用です。
構成ファイルは一連の行から編成されており、各行は、その行の残りのセマンティクスを定義する 1 文字で始めます。スペースまたはタブで始まる行は (そのセマンティクスは定義されない場合も多い) 継続行です。ブランク行と番号記号 (#) で始まる行は無視されます。
マクロには 1 文字の名前を付けます。マクロは ASCII 文字から任意の文字を選んで定義できますが、定義するマクロには大文字の英字だけを使用します。ただし、sendmail によってすでに使用されている M、R、L、G、および V などの文字は使用できません。小文字の英字と特殊記号は内部で使用されます。
マクロを定義する方法は、次の 2 通りです。
D で、直接指定した値を割り当てる
L で、sendmailvars データベース (NIS+ の sendmailvars テーブルまたは /etc/mail/sendmailvars ファイルのどちらか) から検索された値を割り当てる。L コマンドは Sun の独自のインタフェースとして分類される
D マクロ定義の構文は次のとおりです。
DXval |
ここで、X はマクロ名であり、val はその値です。スペースは使えません。マクロは、エスケープシーケンス $X を使ってほとんどの場所で挿入できます。
DRmailhost Dmeng.acme.com |
変数 R は mailhost の値を入れるように設定され、内部変数 m は値 eng.acme.com を入れるように設定されます。
m マクロはメールドメインを定義します。定義しなければ、ネームサービスドメインネームが最初の構成要素を除いて使用されます。たとえば、ecd.east.acme.com は east.acme.com になります。メールドメインネームを定義するさらに柔軟な方法は、L マクロ定義を使用することです。
L マクロ定義の構文は次のとおりです。
LXsearch-key |
ただし、X はマクロ名であり、search-key は sendmailvars データベースから検索されます。検索キーによって探し出されたエントリにある値が X に割り当てられます。
以下に、構成ファイルからの内部 L マクロ定義の例を示します。
Lmmaildomain |
変数 m は、検索キーとして maildomain を使用した sendmailvars データベースの値に設定されます。sendmailvars データベースのエントリが
maildomain eng.acme.com |
の場合、m の値は eng.acme.com になります。
sendmail は /etc/nsswitch.conf ファイルにある sendmailvars エントリを使用し、/etc/mail/sendmailvars ファイルと名前空間を検索する順序を決定します。
アドレス書き換えルールの左辺で対応する単語のクラスを定義できます。たとえば、自分にメールを送信しないためには、このサイトのローカル名すべてのクラスを作成します。
大文字の英字の組み合わせでクラス名を選ぶことができます。小文字の英字と特殊文字はシテスムに使用されます。
クラスを定義する方法は、次の 3 通りがあります。
C で、直接指定された値を割り当てる
F で、別のファイルまたは別のコマンドから値を読み込む
G で、sendmailvars データベース (NIS+ の sendmailvars テーブルまたは /etc/mail/sendmailvars ファイルのどちらか) から検索される値を割り当てる。G コマンドは Sun の独自のインタフェースとして分類される
表 3-6 にクラス定義のさまざまな形式の構文を以下に示します。
表 3-6 構成ファイル内のクラス定義の構文
規則 |
説明 |
---|---|
CX word1 word2 |
クラス X を指定された単語中の任意のものと対応させる |
FX fi1e [pattern] |
file からクラス X 単語を読み込む |
FX | command |
command の出力をクラス X に読み込む |
GXsearch_key |
sendmailvars データベースから search_key を読み込み、クラス X に割り当てる |
最初のフォームでは指定された単語をクラス X と対応するように割り当てます。次の例では、monet と ucbmonet という名前をクラス H に割り当てています。
CHmonet ucbmonet |
第 2 の形式は、たとえば、FC /.rhosts など、ファイルからクラス X に単語を読み取ります。Pattern 引数が指定されている場合は、scanf を使ってファイルから読み込み、ない場合は、各行の最初の単語が使用されます。
第 3 の形式は、あるコマンドを実行してコマンドの標準出力からクラスの要素を読み取ります。
FC | awk '{print $2}' /etc/hosts |
第 4 の形式は、検索キーによって示された sendmailvars データベースにあるエントリからクラスの要素を読み込みます。たとえば、
GVuucp-list |
これは、sendmailvars データベースにある uucp-list エントリからクラス V の定義を読み込みます。
sendmailvars データベースにあるエントリが、
uucp-list sunmoon hugo comic |
の場合、V の値は sunmoon hugo comic になります。
sendmail は /etc/mail/sendmailvars ファイルにある sendmailvars エントリを使用し、/etc/nsswitch.conf ファイルと名前空間を検索する順序を決定します。
クラス定義は、複数行に分割できます。たとえば、
CHmonet ucbmonet |
は、次のようにも表示できます。
CHmonet CHucbmonet |
構成ファイルから (メールプログラム用のフラグまたはコマンド行引数と混同しないように) 複数のオプションを設定できます。オプションも 1 文字で表されます。この行の構文は次のとおりです。
Oc value |
これはオプション c を value に設定します。オプションに応じて、value は、文字列、整数、ブール値 (有効な値 t、T、f、または F があるもの、デフォルトは「true」) 、または時間間隔などです。オプションのリストについては、「sendmail 構成オプション」 を参照してください。
P 制御行を使って Precedence: フィールドの値を定義できます。このフィールドの構文は次のとおりです。
Pname=num |
name が Precedence フィールドにあるとき、メッセージクラスは num に設定されます。数値が大きいほど、優先順位が高くなります。0 より小さな数値では、エラーメッセージが戻されないという特殊な特性があります。デフォルトの優先順位は 0 (ゼロ) です。以下に例を示します。
Pfirst-class=0 Pspecial-delivery=100 Pjunk=-100 |
この構成行は削除されます。これは受け付けられますが無視されます。
ヘッダー行のフォーマットは H 行によって定義します。この行の構文は次のとおりです。
H[c ?c mflagsc ?]c hnamec :c htemplate |
この指定における継続行は送信メッセージに直接挿入されます。htemplate はメッセージに挿入される前にマクロ展開されます。展開しても空であれば、ヘッダー行は入れられません。疑問符で囲まれた mflags を指定すると、ヘッダーを自動的に出力させるには指定するフラグの少なくとも 1 つがメールプログラムで定義される必要があります。これらのヘッダーの 1 つが入力にあれば、これらのフラグとは関係なく出力に送られます。
アドレス解析は、単純なパターンマッチングと置換システムである書き直しルールに従って行われます。sendmail は、ルールの左側 (LHS) で一致するものを探す書き直しルールセットを検索します。ルールが一致すると、その名前はルールの右側 (RHS) で置き換えられます。
書き直しルールセットはいくつかあります。書き直しセットによっては、内部で使用されて特定のセマンティクスが必要なものもあります。その他の書き直しセットは特別に割り当てられたセマンティクスを持たず、メールプログラムの定義または他の書き直しセットによって参照できます。
たとえば、Sn は、収集する現在のルールセットを n に設定します。ルールセットを再度定義すると、新しい定義が古い定義を上書きします。
R を使用してルールセットのルールを定義します。R 行の構文は次のとおりです。
Rlhs rhs comments |
この lhs は入力に適用されるパターンです。一致すれば、入力は rhs に書き直されます。comments は無視されます。
以下に、ルールの定義の例を示します。
# handle "from:<>" special case R<> $@@ turn into magic token |
1 文字以上のタブ文字でフィールドを区切らなければなりません。フィールドには空白文字を使うことができます。
メールプログラムに対するプログラムとインタフェースは、この行で定義されます。フォーマットは次のとおりです。
Mc name, c {c field=value}* |
ただし、name は (エラーメッセージに使用される) メールプログラムの名前で、field=value のペアはメールプログラムの属性を定義します。表 3-7 にフィールドを示します。
表 3-7 メールプログラム定義フィールド
フィールド |
説明 |
---|---|
A |
このメールプログラムに渡す引数ベクトル |
D |
メールプログラムの作業用ディレクトリ |
E |
このメールプログラムに渡す行末の文字列 |
F |
このメールプログラムの特殊フラグ |
L |
メッセージ本体の行の最大長 |
M |
このメールプログラムへのメッセージの最大長 |
P |
メールプログラムのパス名 |
R |
受信者名の書き直しルールセット |
S |
sendmail の新版 (バージョン 8) には、sendmail.cf ファイルのバージョンを定義するための、新しい構成オプションがあります。このオプションを使用すれば、旧バージョンの構成ファイルをバージョン 8 の sendmail で使用できます。バージョンレベルには 0 から 5 の値を設定できます。また、ベンダの定義もできます。Berkeley または Sun がベンダオプションとして有効です。構成ファイルで V オプションが定義されていない場合は、V1/Sun がデフォルトの設定となります。ベンダを定義せずに、バージョンレベルだけが設定されている場合は、Berkeley がデフォルトとして使われます。表 3-8 に有効なオプションを示します。
表 3-8 構成ファイルのバージョン
定義 |
説明 |
---|---|
V0/Sun |
ネームサービスのサポートに Solaris の拡張機能を使用しない |
V1/Sun |
ネームサービスのサポートに Solaris の拡張機能を使用する (デフォルトの設定) |
V1 |
Berkely の構成ファイルの旧版に使用 |
V5 |
Berkeley の構成ファイルの新版に使用 ($w でホストの短縮名が設定される) |
Sun がベンダとして定義されているときは、レベルの定義に使用できるのは、V0 と V1 だけです。
この節では、書き直しルールとメールプログラムの記述について詳細に説明します。
特殊マクロはコンストラクト $x を使って参照されます。x は一致 (LHS) または挿入 (RHS) されるマクロの名前です。小文字の英字は、特定のセマンティクスに使用され、特殊文字には、条件文に使用されるものもあります。
sendmail に情報を送信するには、表 3-9 に示すマクロを定義する必要があります。
表 3-9 必要とされる sendmail マクロ
マクロ |
説明 |
---|---|
ARPANET フォーマットでの開始日付 |
|
ARPANET フォーマットでの現在の日付 |
|
ホップカウント |
|
UNIX (ctime()) フォーマットでの日付 |
|
SMTP が起動したとき印刷される |
|
発信者 (from) 名 |
|
受信者へ送信する発信者名 |
|
受信者ホスト |
|
待ち行列 ID |
|
このサイトの公式ドメイン名。$e マクロの最初の単語であり、$j はドメイン名のフォーマットである必要がある |
|
UUCP ノード名 (uname から) |
|
UNIX の From 行のフォーマット |
|
gethostname 戻り値のドメイン部分 |
|
デーモン名 (エラーメッセージ用) |
|
トークンとみなされる文字のリスト |
|
sendmail のプロセス ID |
|
発信者アドレスのデフォルトフォーマット。メッセージの作成時にメッセージ上の発信者の表現方法を指定する |
|
使用するプロトコル |
|
発信者のホスト名 |
|
現在の時間の数値表 |
|
受信者ユーザー |
|
sendmail のバージョン数 |
|
このサイトのホスト名 |
|
発信者のフルネーム |
|
受信者のホームディレクトリ |
|
発信者アドレス |
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 つのホストのようにすることもあります。
$?x$x $.<$g> |
これらは、次の 2 つのフォーマットに対応します。
doe@acme.com (John Doe) John Doe <doe@acme.com> |
マクロによっては、メールプログラムの引数または他のコンテクストに使用する sendmail によって定義されるものもあります。これらのマクロを表 3-10 に示します。
表 3-10 別の sendmail マクロ定義
マクロ |
説明 |
---|---|
ドメイン名 |
|
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 を示す |
パターンのいずれかが一致すると、右側で置換するため記号 $n に割り当てられます。n は LHS の索引です。たとえば、LHS ルールは、次の入力に適用できます。
$-:$+ JUPITER:eric |
ルールは一致し、RHS に渡される値は次のようになります。
$1 JUPITER
$2 eric
名前空間で作業するため、幾つかの特殊な規則が追加されています。これらの規則は 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 を展開する |
|
LHS から未定義のトークン n を置き換える。n は数字 |
|
ルールセット n を呼び出す。n は数字 |
|
mailer に対する名前解決を行う |
|
host を指定する |
|
user を指定する |
|
一次ホスト名にマップする |
|
NIS マップまたは NIS+ テーブル $x から名前をマップする。マップ名が rev で始まる場合、sendmail は別名を逆にする |
$n (n は数字) 構文は、LHS で一致した $+、$-、$*、$‾x から対応する値を置き換えます。これは任意の場所で使用できます。
$>n 構文は、通常行の残りを置換してからルールセット n に渡します。ルールセット n の最後の値は次に (プロシージャまたは関数呼び出しなど) このルールの置き換えになります。
ルールセット 0 では $# 構文だけを使用します。ルールセットの評価はすぐ中断され、sendmail にその名前が完全であることを示します。完全な構文は次のとおりです。
$#mailer$@host$:user |
これは、メールプログラムの指示に必要な 3 要素 {mailer、host、user} を指定します。メールプログラムには、さらに多くの処理が行われるものもがあります。たとえば、ローカル名が別名になることがあります。
右辺の前にも $@ または $: を付け、評価を制御できます。$@ プレフィックスにより右辺の残りは値に戻ります。$: プレフィックスによりルールはすぐに終了しますが、ルールセットは続きます。したがって、これは、ルールを 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 は、sendmail が名前を処理する前にでも sendmail に適用されます。ルールセット 3 は、名前を次のような基本構文の 1 つの形式に変えます。
local-part@host-domain-spec |
@ が指定されていない場合は、発信者名から host-domain-spec を追加できます (C フラグが送信メールプログラムに対応してメールプログラムの定義で設定されている場合)。
ルールセット 0 は、ルールセット 3 の後で、実際に受信者を指定する名前に適用されます。ルールセット 0 では、mailer、host、user の 3 要素を決定しなければなりません。mailer は構成ファイルのメールプログラム定義で定義される必要があります。host は指定されたメールプログラムの引数展開で使用するために $h マクロに定義されます。user は $u に定義されます。
ルールセット 1 は、すべての From: 受信者名に適用され、ルールセット 2 は、すべての To: 行と Cc: 行に適用されます。次に、メールプログラムの定義行 (および R=) に指定されたルールセットが適用されます。この処理は、そのメッセージがルールセット 0 によっていくつのメールプログラムに送信されるかに対応して 1 つのメッセージに対して何度も行われます。
ルールセット 4 は、メッセージのすべての名前に対し、最後に適用されます。通常、内部形式を外部形式に変換する場合に使用されます。
ルールセット 0 において特殊名 error を持つメールプログラムを使用してユーザーのエラーメッセージを生成できます。ユーザーフィールドは出力されるメッセージです。
$#error$:Host unknown in this domain |
たとえば、次のようなエントリがルールの右側 (RHS) にあるとき、左側 (LHS) が一致すると指定のエラーを生成します。
各メールプログラムには、内部名があります。内部名は任意ですが、local と prog という名前はそれぞれ 1 番目と 2 番目に定義しなければなりません。ルールセット 0 はこのメールプログラム名 (およびホスト名、ユーザー名) に対する名前を解決します。
P フィールドではメールプログラムのパス名を与えます。このメールプログラムが TCP 接続によりアクセスされる場合、代わりに文字列 [TCP] を使用してください。
F フィールドではメールプログラム用のフラグを定義します。発信者の名前を渡すため、それぞれ f または r フラグのように、f または r フラグを指定します。特定の条件のもとでエラーとなるメールプログラムに対応するために、これらのフラグは、sendmail に渡されたときだけ渡されます。argv テンプレートにおいて f$g を指定できる場合もあります。メールプログラムが root として呼び出され、sendmail が root に対し 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 に対応するメールプログラムで定義される場合に限ります。
メールプログラムの記述における S と R フィールドは、それぞれ発信者と受信者名に適用されるメールプログラムごとの書き直しセットです。送信するドメインが追加され、一般的な書き直しセット (番号 1 または 2 のいずれか) が適用された後、これらは適用されますが、出力書き直し (ルールセット 4) よりは先に適用されます。通常、ドメインをまだ持たない名前にカレントドメインを追加するため使用します。たとえば、この形式のヘッダーは次のとおりです。
From: eric@host |
これが次のように変わります。
From: eric@host.colorado.edu |
または、
From: saturn!eric |
これは、送信先のドメインによって異なります。また、これらのセットは、ルールセット 4 と同時に使って特殊な目的の出力の書き直しにも使用できます。
表 3-13 には、構成ファイルで使用可能な追加のフラグを示します。
表 3-13 メールプログラム記述の追加フラグ
たとえば、次の指定は、ローカル配信と 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 を受信者名に適用します。メッセージに送信する引数ベクトルは、mail、d、および受信ユーザーの名前を含む単語です。r フラグを挿入する場合は、mail と d の間に入れます。
2 番目のメールプログラムは ether と呼ばれます。これは TCP 経由で接続され、同時に複数のユーザーを処理できます。接続を延長し、発信者名のドメインをドメインのない受信者名に追加します。ルールセット 11 によってプロセス発信者名を、ルールセット 21 によって受信者名を処理します。このメールプログラムに渡されるメッセージは、100,000 バイトに制限されています。
最初から構成ファイルを構築することは、複雑な作業です。しかし、それはほとんど必要ではなく、既存のファイルを変更することにより、ほとんどすべての状況に対応できます。何をしようとしているのかを理解し、メール配信の方針を見いだすことが重要です。この節では、構成ファイルの目的を説明し、方針についていくつかのヒントを与えます。
RFC 1006 はドメインベースの命名方針について説明しています。また、RFC 822 も、この問題を扱っています。本質的に、各ホストには、明確なルートから右から左へドットで指定された疑似経路の名前を与えられます。経路の要素は物理的なネットワークではなく組織のエンティティです。
RFC 822 と RFC 976 は、あるアドレスのソートがどのように解析されるかを指定しています。ユーザーは、sendmail がこれらのルールに従うか、またはルールを無視するかを設定できます。
方針を確立したら、任意のファイルの主要部分を使用できるかどうかを判断するために、使用可能な構成ファイルを検討します。最悪の条件下でも、収集できる役に立つ情報がかなりあります。
次の段階は、ルールセット 3 を構築し、個々のメールプログラムに対してルールセットを指定することです。ルールセット 3 の構築はこの作業で最も難しい部分です。以下に、いくつかのガイドラインを示します。
ユーザーの行うことのすべてがメッセージに反映されるので、このルールセットで名前に対し多くのことをやりすぎないように留意してください。
このルールセットではローカルドメインを削除しないでください。削除すると、まったくドメイン指定のない名前を残すことになります。sendmail はドメインのない名前に送信ドメインを追加しますが、それは名前のセマンティクスを変更してしまいます。
このルールセットでは完全指定ドメインを与えないでください。技術的には正しくても、完全に指定したドメイン名はメッセージ内容に反映され、不必要に長い名前になる可能性があります。SunOS 構成ファイルではルールセット 9 を定義して、ドメイン名を指定しローカルドメインを削除します。ルールセット 9 はルールセット 0 から呼び出され、すべての名前をよりクリーンな形式にします。
ルールセット 3 を終了すると、他のルールセットは比較的単純になるはずです。ヒントが必要ならば、構成ファイルを検討してください。
構成ファイルを構築する際、sendmail のテストモードを使って一定量のテストを行うことができます。たとえば、sendmail を次のように起動できます。
% sendmail -bt -Ctest.cf |
これにより、構成ファイル test.cf を読み込み、テストモードに入ります。以下に例を示します。
ADDRESS TEST MODE Enter <ruleset> <name> > |
このモードでは、次のように行を入力します。
ADDRESS TEST MODE Enter <ruleset> <name> > rwset name |
ただし、rwset は使用したい書き直しセットで、name はそのセットを適用する名前です。テストモードでは、進行に従ってそのステップを示し、最後の名前を表示します。ルールを順次適用していくように、rwset をカンマで区切ったリストを使用できます。以下に例を示します。
ADDRESS TEST MODE Enter <ruleset> <name> > 3,1,21,4 jupiter:smith |
最初に、ルールセット 3 を入力 monet:bollard に適用します。次にルールセット 1 がルールセット 3 の出力に適用され、同様にルールセット 21 および 24 に続きます。
さらに詳細を必要とする場合は、d21 フラグを使用し、より詳細なデバッグをすることもできます。以下に例を示します。
% sendmail -bt -d21.99 |