メールシステムの管理

第 3 章 sendmail 構成ファイルのカスタマイズ

sendmail プログラムは、構成ファイルを使用して「別名」変換と転送、ネットワークゲートウェイへの自動ルーティング、柔軟な構成を提供するメール転送エージェントです。SunOS 5.x オペレーティングシステムには、ほとんどのサイトで使用できる標準の構成ファイルが付属しています。第 2 章「メールサービスの設定と管理」では、標準のファイルを使用して電子メールシステムを設定する方法について説明しています。この章では、sendmail 構成ファイルを作成してサイトのニーズに合わせるためのカスタマイズ方法を説明します。

sendmail の概要

sendmail プログラムは、TCP/IP や UUCP など、異なるタイプの通信プロトコルを使用できます。また、SMTP サーバー、メッセージ待ち行列機能、およびメーリングリストも組み込まれています。名前の解釈は、ドメインベースの命名規則と特定の命名規則を共に処理できるパターンマッチングシステムによって行われます。

sendmail プログラムでは、ドメインベースの命名規則を使用できるほか、あいまいさを解決する古い名前構文も使用できます。また、sendmail は、異なる命名機構の間でメッセージを変換することもできます。ドメイン方式では、物理的な命名と論理的な命名との問題を分けて扱います。インターネットドメイン命名規則については、TCP/IP とデータ通信 を参照してください。

他のネットワーク上のホストに対してローカルとなるネットワーク名を提供するなど、特定の方法によって特殊なケースも処理できます。

sendmail プログラムの機能

sendmail プログラムには、次のような機能があります。

図 3-1 には、sendmail がメールシステムで他のプログラムと対話する方法を示します。

図 3-1 sendmail と他のメールプログラムとの対話

Graphic

ユーザーは、メール生成プログラムおよび送信プログラムと対話します。メール送信が依頼されると、メール生成プログラムは sendmail を呼び出し、sendmail は適切なメールプログラムにメッセージを送ります。発信者の一部はネットワークサーバーであったり、またメールプログラムの一部はネットワーククライアントであるため、sendmail は、インターネットメールゲートウェイとしても使用できます。

sendmail 機能

sendmail プログラムは、管理者が定義したメールプログラムを呼び出してメッセージを配信するメッセージルーターです。sendmail はメールプログラムからメッセージを収集し、宛先のメールプログラムで必要なメッセージのヘッダーを編集し、適切なメールプログラムを呼び出して配信したり、ネットワーク送信のために待ち行列に入れたりします。ただし、ファイルにメールを送るときは、sendmail は直接配信します。メールプログラムは最小コストで追加できます。

sendmail インタフェース

sendmail プログラムは、次の 3 通りの方法で外部と通信します。

引数ベクトルと終了状態

プロセスと通信する標準的な方法は、引数ベクトル (コマンド名と引数) を使用することです。引数ベクトルは受信者のリストを送信し、メッセージ本体は標準入力に送信されます。問題が発生すると、メールプログラムが出力するものはすべて収集され、発信者に戻されます。メッセージが送信された後、メールプログラムからの終了状態が収集され、必要ならば診断が出力されます。

パイプを使用する SMTP

SMTP プロトコルを使用して、メールプログラムとの対話的なロックステップインタフェースを実行できます。サブプロセスはまだ作成されますが、受信者の名前は引数リストを経由してメールプログラムに渡されません。代わりに、プロセスの標準入力に送信されるコマンドで一度に 1 つずつパイプを通して渡されます。標準出力に表示されるものはすべて標準 SMTP 応答コードです。

TCP を使用する SMTP

この方法は、TCP 接続を使用することを除いては、パイプを使用する SMTP に似ています。通常、TCP 接続上の SMTP を使用して別のシステム上の sendmail プロセスに接続します。メールプログラムが同じマシンにある必要がないため、これは非常に柔軟な方法です。

sendmail の動作

sendmail プログラムは mailxmailtool などのプログラムからメッセージを収集し、宛先のメールプログラムの要求で必要な場合にメッセージヘッダーを編集し、適切なメールプログラムを呼び出して配信したり、ネットワーク送信のために待ち行列に入れたりします。


注 -

sendmail プログラムはメッセージ本体の編集や変更は一切行いません。電子メールアドレスの解釈のためのいかなる変更も、メッセージのヘッダーでだけ行われます。


引数処理とアドレス解析

sendmail が入力を受けると、受信者の名前を収集し (コマンド行か SMTP プロトコルのどちらかから)、2 つのファイルを生成します。1 つはヘッダーと受信者のリストを含む「封筒」に相当するファイルです。別のファイルにはメッセージ本体が含まれます。sendmail プログラムはメーリングリストも含め別名を展開し、リモートの受信者の確認ができるかぎり行われます。次に構文をチェックし、ローカルの受信者を確認しますが、ホスト名の詳細なチェックは配信まで行われません。sendmail がローカルの受信者を確認すると、メッセージの転送が行われます。

sendmail は、受信者リストを解析したあとで封筒とメッセージのヘッダーの両方に名前を追加します。名前が別名に変換されるか、または転送されると、古い名前がリストに保存され、配信フェーズでこの受信者を無視するよう指示するフラグが設定されます。このリストは重複がないように管理されていて、1 人が 2 つの異なるグループに所属している場合に発生するような別名ループ、およびメッセージが重複して同じ受信者に配信されるといったことを防ぎます。


注 -

別名リストに、異なる構文を使用した同じ個人宛の電子メールアドレスがある場合、ユーザーは、同じメッセージを 2 回受けとることがあります。sendmail は、内容が同じメールの電子メールアドレスを必ず比較できるとは限りません。


メッセージの収集

すべての受信者名が解析されて確認されると、メッセージが収集されます。メッセージはメッセージのヘッダーと本体の 2 つの部分に分かれてきます。ヘッダーと本体はブランク行で分けられます。

ヘッダーは次の形式で一連の行として初期設定されます。


field-name: field-value

たとえば、サンプルヘッダーは次のようになります。


From: John Smith <Smith@colorado.edu>

後に続く行をスペースかタブで始めて、field-value を複数の行に分けることができます。ヘッダーフィールドの一部には、特別な内部の意味を持ち、それに応じた特別な処理のあるものがあります。他のヘッダーは単純に渡されます。タイムスタンプのように自動的に追加されるヘッダーもあります。

テキスト行でなければならない点を除き、メッセージ本体のフォーマットについての条件はありません。sendmail はヘッダーをメモリに格納し、メッセージ本体を一次ファイルに保存します。プログラムインタフェースを単純化するため、たとえ有効な名前がなくてもメッセージは収集されます。いずれの名前も有効でない場合、このようなメッセージは送信者にエラーで戻されます。


注 -

DeskSetTM のメールツール側では、ユーザーはバイナリデータを転送できます。ただしメールツール側でコード化する必要があります。sendmail プログラムはバイナリデータのコード化を自動的には行いません。バイナリデータメッセージのコード化とデコードの方法については、mailtool(1) のマニュアルページを参照してください。


メッセージ本体は SMTP チャネルでの転送時に、ドットで始まる行のドットが二重になる点を除き、メッセージ本体の解釈や処理は一切行われません。この余分なドットは受信者が取り除きます。

メッセージの配信

送信待ち行列はメッセージのバッチ処理のため転送する前に、受信側ホストによってグループ分けされます。処理の進行につれ、引数リストが構築されます。ファイルに送信されるメールは、送信リストの処理中に検出されます。

接続が確立すると、sendmail はヘッダーにメールプログラムごとの変更を加え、メールプログラムに結果を送信します。メールプログラムによって排除されるメールがある場合は、すべての配信の完了後にフラグが設定されて送信者に返送する機能を呼び出します。

sendmail プログラムは、sendmail にメッセージを転送するのに使用するのと同じインタフェースの 1 つを使用して、メールプログラムにメッセージを送信します (UNIX での慣例的な引数群と終了状態を使用して、UNIX の 1 組のパイプ経由で、または TCP 接続で SMTP を使用して通信を行う)。メッセージの各コピーには、カスタマイズしたヘッダーが付いています。

エラーの処理

メールが配信できない場合は、メールプログラムで状態コードがキャッチおよびチェックされ、そして適当なエラーメッセージが必要に応じて出されます。終了コードはシステムの標準に準拠している必要があります。非標準の終了コードが使用されると、sendmail「Services unavailable」 というメッセージが送信されます。

再送のための待ち行列

メールプログラムが 「temporary failure」 終了状態を戻した場合、メッセージは待ち行列に入っています。制御ファイルは、受信者とその他各種のパラメータを記述します。この制御ファイルのフォーマットは一連の行になっていて、この各行に送信者、受信者、依頼の時刻、メッセージのその他のパラメータが記述されます。メッセージのヘッダーは制御ファイルに保存されるので、待ち行列にある対応するデータファイルは、すでに収集されていた一時ファイルにすぎません。

発信者への返却

処理中にエラーが発生すると、sendmail は再送のためメッセージを発信者に戻します。その手紙は返送されるか、または発信者のホームディレクトリにある dead.letter ファイルに書き込まれます。

メッセージヘッダーの編集

ある程度のメッセージヘッダーの編集は自動的に行われます。ヘッダー行は、構成ファイルの制御によって挿入されます。行によってはマージできます。たとえば、From: 行と Full-name: 行は、特定の状況ではマージできます。

構成ファイル

ほとんどすべての構成情報はテキストファイルから実行時に読み出され、マクロ定義 (内部で使用されるマクロの値)、ヘッダー宣言 (特殊処理されるヘッダー行と追加または再フォーマットされる行のフォーマット)、メールプログラム定義 (各メールプログラムの配置と特性などの情報を与える)、および名前の書き換えのルール (名前の書き換えに使用される限定パターンマッチングシステム) が含まれます。

sendmail の実装

sendmail を SMTP モードで実行しない限り、フラグ引数の後に受信者名引数を指定できます。次に受信者名の形式を簡単に示します。

かっこ、角かっこ、および二重引用符は必ずペアになっていなければなりません。書き換えのルールはこのあとに必要な処理を制御します。

ファイルとプログラムへのメール

ファイルとプログラムは、正当なメッセージ受信者です。ファイルはメッセージを格納する記憶領域を提供し、プロジェクト管理や履歴に役立ちます。プログラムはさまざまな状況で受信者として便利で、たとえば、mailsort を使用してメールをソートしたり、ユーザーが不在のときに vacation プログラムで通知メッセージに応答させることができます。

ローカル名として最初の解析アルゴリズムを通して渡される名前はすべて、次の 2 つの特殊な場合に処理されます。

構成の概要

構成は、起動時に読み込まれる構成ファイルによって主に制御されます。メールプログラムの追加、または情報の書き換えやルーティングの変更は、再コンパイルを必要としません。構成ファイルは、マクロ定義、ヘッダー定義、メールプログラム定義、書き換えルール、オプションなどをコード化します。

マクロ

マクロを使用する方法はいくつかあります。あるマクロは、sendmail がエラーメッセージの中で自分自身を識別するのに使用する名前のような、構造化されていないテキスト情報をメールシステムに送信します。また、内部では使用されず、構成ファイルで省略記法として使用されるマクロもあります。

ヘッダーの宣言

ヘッダー宣言は、既知のヘッダー行のフォーマットを sendmail に通知します。From: 行や Date: 行など、いくつかのヘッダー行に関する情報は sendmail に組み込まれています。

ほとんどの構成済みヘッダーは、着信メッセージになければ送信メッセージに自動的に挿入されます。メールプログラムによっては抑止されるヘッダーがあります。

メールプログラムの宣言

メールプログラムの宣言は、メールプログラムの内部名、メールプログラムに関連付けられたいくつかのフラグ、および、呼び出し時に使用される引数ベクトルを指定します。このベクトルは使用前にマクロ展開されます。

名前書き換えのルール

名前書き換えのルールは sendmail での名前解析の重要な部分です。これらのルールは、特定の順序で並んだパターン置換ルールのリストで、各名前に適用されます。たとえば、ルールセット 0 は使用するメールプログラムを決定します。sendmail は、解析可能な形式になるまで、メッセージを書き直します。パターンが一致すると、一致できなくなるまで、そのルールが繰り返し適用されます。

また、構成ファイルは異なるフォーマットへの名前の編集もサポートします。たとえば、次の名前を考えてみましょう。


ucsfcgl!tef

この名前は次のようにマッピングされます。


tef@ucsfcgl.UUCP

この結果内部構文に合わせることができます。また、特定のメールプログラムに対応して逆方向に変換することもできます。

オプションの設定

構成ファイルから設定できるオプションもあります。これらには、各種のサポートファイルのパス名、タイムアウト、デフォルトモードなどがあります。

sendmail への引数

sendmail のコマンド行引数」 に、sendmail に付ける引数のリストと詳細な説明があります。いくつかの重要な引数についてはここで、説明します。

待ち行列の間隔

q フラグは、sendmail が待ち行列を処理する頻度を定義します。モード i または b (デフォルト) で動作すると、ダウンしたホストを再起動するときに関係するだけなので、この時間は比較的長くできます。ただし、q モードで動作すると、フラグはメッセージが待ち行列に入っている最長時間を定義するため、その時間は比較的短くなります。通常、待ち行列の時間は、15 分 (q15m) から 1 時間 (q1h) の間で設定されます。

デーモンモード

TCP 接続を通して着信メールを受信する場合は、デーモンを実行する必要があります。/etc/rc3.d/S88sendmail ファイルの bd フラグをセットします。

次のように、1 度の呼び出しで bd フラグと q フラグを結合できます。


# /usr/lib/sendmail -bd -q30m

デバッグ

sendmail には多くのデバッグフラグがあり、これらは -d オプションを使って設定します。各デバッグフラグには番号とレベルがあり、レベルが高いほど「詳細な印刷」を意味します。通常、特定のコード部分をデバッグするのでない限り、9 より大きなレベルを設定する必要はありません。表 3-1 に、デバッグフラグの例を示します。

表 3-1 sendmail デバッグフラグの例

デバッグフラグ 

説明 

-d12

フラグ 12 をレベル 1 に設定 (デフォルト) 

-d12.3

フラグ 12 をレベル 3 に設定 

-d3-17

フラグ 3 から 17 までを レベル 1 に設定 (デフォルト) 

-d3-17.4

フラグ 3 から 17 までを レベル 4 に設定 

-d3, 17.4

フラグ 3 をレベル 1 に (デフォルト)、 フラグ 17 を レベル 4 に設定 

ソースコードがある場合、そのコードにあるデバッグフラグのリストを参照できます。

別の構成ファイルの使用

C フラグを使って別の構成ファイルを指定できます。以下に例を示します。


# /usr/lib/sendmail -Ctest.cf

これは、デフォルト /etc/mail/sendmail.cf の代わりに構成ファイル test.cf を使用します。C フラグの値を定義しない場合は、カレントディレクトリの sendmail.cf ファイルを使用します。

構成パラメータの調整

サイトの要件に応じて、いくつかの構成パラメータを調整できます。構成ファイルのオプションを使用することにより、これらのパラメータのほとんどを設定できます。たとえば、OT3d という行はオプション T3d (3 日) という値に設定します。

時間値

時間間隔はすべて数字と英字の構文を使用します。たとえば、10m は 10 分で、2h30m は 2 時間 30 分です。

表 3-2 に、時間を表す記号を示します。

表 3-2 時間構文のオプション

コード 

説明 

s

秒 

m

分 

h

時間 

d

日 

w

週 

待ち行列の間隔

q フラグに付ける引数は、sendmail が待ち行列を実行する頻度を指定します。通常、15 分 (q15m) から 1 時間 (q1h) の間で設定されます。

読み取りタイムアウト

構成ファイルの Or オプションは、読み取りタイムアウトを設定します。デフォルトの読み取りのタイムアウトは Or15m です。文献にあるプロトコルでは技術的に使用できませんが、sendmail は標準入力の読み取り、またはリモート SMTP サーバーからの読み取りの際にタイムアウトすることがあります。サイトに読み取りタイムアウトに関する問題がある場合、アイドル状態のデーモンがシステム上で衝突する機会を減らすため、読み取りのタイムアウトを 1 時間 (Or1h) など、より大きな値に設定してください。

メッセージのタイムアウト

構成ファイルの OT オプション は、メッセージのタイムアウトを設定します。デフォルトのメッセージのタイムアウトは 3 日 (OT3d) です。メッセージがメッセージのタイムアウト後に待ち行列にあると、発信者にメッセージが配信されないことが通知されます。

短いメッセージのタイムアウトで待ち行列を処理することにより、短期間ハングしていたメッセージを点滅表示できます。たとえば、次のコマンドがあります。


# /usr/lib/sendmail -oT1d -q

このコマンドで、待ち行列を処理して、1 日以上経過したメッセージをすべて点滅表示します。

配信モード

構成ファイルの Od オプションは、配信モードを設定します。デフォルトの配信モードは Odbackground です。配信モードは、メールを配信する速度を指定します。表 3-3 に、有効なモードを示します。

表 3-3 配信モードのオプション

コード 

説明 

i

対話的に配信 (同期) 

b

バックグラウンドで配信 (非同期) 

q

待ち行列に入れるだけ (配信しない) 

トレードオフがあります。対話モード (i) でを発信者に渡される情報量は最大になりますが、このモードはほとんど必要ありません。待ち行列モード (q) は、マシンの負荷を最小にしますが、実際の配信は、最大で待ち行列の配信間隔まで遅延されます。デフォルトのバックグラウンドモード (b) はその中間となります。

負荷制限

中央のメールマシンは、しばしば過負荷状態になります。最もよい解決法はメールを処理するより強力なマシンを提供することですが、その負荷は、割り当てられたリソースをすべて消費するためほとんど常に拡大します。

sendmail プログラムでは負荷を制限できます。負荷を制限する目的は、長いメッセージ、多数の受信者へのメッセージ、長時間ダウンしていたサイトへのメッセージを配信するロード時間の無駄を省きます。

OxOX オプションは、sendmail によって発生する負荷を制限するのに使用します。オプションを使用しなければ、デフォルトで負荷制限を設定していません。これらの構成オプションは負荷平均を表す整数の引数で指定します。たとえば、Ox4OX8 を指定すると、負荷が 4 より大きいと x 負荷制限が使用され、負荷が 8 より大きいと X 負荷制限が使用されます。負荷が X オプションで指定した値より大きいとき、SMTP サーバーはネットワークからの接続を受け付けません (ローカルで発信されたメールと UUCP などの他のメールは影響を受けません)。x オプションではさらに、メッセージをそれ以降の配信のために待ち行列に入れるか、または即座に配信するかを制御します。これには、常に「短い」メッセージは即座に配信し、「長い」メッセージはピーク時を避けて配信するという原則があります。

Oq オプションは即座に配信されるメッセージの最大サイズを指定します。メッセージの「サイズ」には、メッセージのバイト数だけでなく、受信者がかなり多い場合と配信されなかった場合のペナルティも含めます。受信者に対するペナルティはオプション値 y で、デフォルトでは 1000 に設定されます。配信の試みに対するペナルティはオプション値 z で、デフォルトでは 9000 に設定されます。また、サイズ制限は現在の負荷によって異なるため、負荷が大きくなるにつれて待ち行列に入るメッセージの数は増えます。たとえば、負荷がしきい値 x より 1 つ上であれば制限は半減して、負荷がそのしきい値より 2 つ上であれば制限は 3 分の 1 になります。また、待ち行列を処理するときに配信されるメッセージにも適用されることに注意してください。

ログレベル

sendmail のログを作成するレベルを調整できます。次の表 3-4 に、そのレベルを示します。

表 3-4 ログレベルコード

コード 

説明 

0

ログなし 

1

深刻なシステム故障やセキュリティ上の問題など主要な問題のみ 

2

通信の損失 (ネットワーク問題) とプロトコル障害 

3

その他の深刻な障害 

4

その他の小さな障害 

5

メッセージ収集統計情報 

6

エラーメッセージ、VRFY および EXPN コマンドの作成 

7

配信障害 (ホストやユーザーが不明など) 

8

正常な配信 

9

(デフォルト) メッセージの遅延 (ホストのダウンなどが原因) 

10

データベースの拡張 (別名、転送および userdb の検索) 

15

別名データベースの自動再構築 

20

ログがロックされた待ち行列ファイルを処理しようとした 

30

ロックの損失 

詳細は、Solaris のシステム管理 を参照してください。

ファイルモード

ファイルによっては、アクセスを制御する保護モードがあります。この節では、 sendmail.cf ファイルから制御できるモードについて説明します。使用するモードは、必要な機能とセキュリティレベルによって異なります。

setuid

デフォルトではユーザーのホームディレクトリに書き込むプログラムに配信できるように、sendmail プログラムはユーザー ID を 0 にして (setuidroot に設定して) 実行されます。sendmail がメールプログラムを実行する準備ができると、sendmail はユーザー ID が 0 であるかどうかを調べ、0 であれば、ユーザー ID とグループ ID を、構成ファイルにある u オプションと g オプションで設定されている値にリセットします。ユーザー ID とグループ ID はともに 1 (daemon) に設定されます。メールプログラムに S フラグを設定することにより、これらの値を無効にできます (信頼性があり、root で呼び出す必要のあるメールプログラムの場合)。ただし、メール処理はメールを送信するユーザーではなく root が担当します。

一時ファイルモード

OF オプションは、sendmail が使用するすべての一時ファイルのモードを設定します。デフォルト値の 0600 はセキュリティの高いメールに使用され、0644 ではアクセス権が緩和されます。この 0644 モードを使用すると、(待ち行列を処理する際でも) sendmailroot として実行する必要はありません。ユーザーは、待ち行列にあるメールを読み取ることができます。

自分の別名データベースを書き込み可能にすべきか

1 つの方法は、別名データベース (/etc/mail/aliases) をモード 666 にすることです。この方法を使用すると、ユーザーは任意のリストを修正できます。ただし、ユーザーが編集できるファイルに別名を書き込んで、/etc/mail/aliases からそのファイルを参照することにより、ユーザーが変更できるような別名に制限を加える場合には、次のように指定します。


alias-name::include:/filename

sendmail 構成ファイル

この節では、構成ファイルを詳細に説明し、独自のファイルを書くためのヒントを示します。

構文解析は sendmail が起動するたびに行われるため、構成ファイルの構文は解析しやすいものです。ただし、残念ながらこの構文は読みにくいものです。

sendmail は、次の関数に対して 1 文字の英字を使用します。

次の節には、構成ファイルの概要とそのセマンティクスについての詳細な説明があります。デフォルトの main.cf ファイルのコピーは、付録 A 「sendmail 構成ファイル」 にあります。

sendmail 構成ファイルの目的

sendmail 構成ファイルは次の 3 つの部分に分かれています。

記号、クラス、オプションとパラメータを定義して、sendmail の環境を設定して、オプションを設定していくつかの重要なマクロを定義します。

メールプログラムと配信プログラムを定義することによって、sendmail が正しいプロトコルを使用し、正しい配信プログラムとやりとりできるようになります。

書き換えルールを定義してルールセットにまとめ、別の形式にアドレスを変換します。一般に、ルールセットの各ルールは特定のアドレスに適用されます。アドレスはルールセット内で何度か書き換えられることがあります。

標準のルールセットは 7 つあり、表 3-5 に示す順に適用されます。

表 3-5 ルールセットの適用の順序

ルールセット 

説明 

3

適用される最初のルールセット。アドレスを local-address@host-domain に変換しようとする

0

宛先と送信に使用するメールプログラムを判定する。宛先を 3 つ (メールプログラムホストユーザー) に処理する

1

発信者のアドレスを書き換える 

S

発信者アドレスに追加のルールセットを指定し、最後のメールプログラム固有のクリーンアップが可能。これらのルールセットには、各メールプログラムごとに異なる名前がある。たとえば、 S は一般の「発信者 (sender)」を表す

2

受信者のアドレスを書き換える 

R

受信者アドレスに追加のルールセットを指定し、最後のメールプログラム固有のクリーンアップが可能。これらのルールセットには、各メールプログラムごとに異なる名前がある。この例の R は一般の「受信者 (recipient) 」を表す 

4

通常内部形式から外部形式に、前回のアドレスをすべて書き換える 

ルールセット 0 は内部的な形式に変換される必要があります。この内部形式はメールプログラム記述子へのポインタとして使用されます。メールプログラム記述子は、メールプログラムのインタフェースの必要条件を記述します。

メッセージにある名前の書き換えは、通常、2 つのフェーズで行われます。最初のフェーズは、ルールセット 3 を使用して任意のフォーマットの名前を local-address@host-domain 形式に変換します。第 2 フェーズは、その名をメールプログラムの受信に適した構文の標準形式に変換します。sendmail は 3 つのサブフェーズで名前を書き換えます。ルールセット 1 はすべての発信者の名前に、ルールセット 2 はすべての受信者の名前に適用されます。メールプログラムの定義中にメールプログラム固有のルールセットを指定できます。最後に、ルールセット 4 は、外部形式への変換を行うために適用されます。

RFC 822 では、メールメッセージそのもののフォーマットを説明しています。sendmail はこの RFC に準拠しています。したがって、カスタマイズするには、このマニュアルに説明がある多数の標準的なコードを変更する必要があります。特に次の文字は特殊な意味に解釈されます。

< > () " ¥


注意 - 注意 -

RFC 822 特殊文字 < > ( ) " ¥ は、特定の目的に使用してください。かっこ () の中の情報は、コメントまたは個人用です。角かっこ <> の中の情報は local-address@host-domain アドレス用です。


sendmail 構成ファイルの構文

構成ファイルは一連の行から編成されており、各行は、その行の残りのセマンティクスを定義する 1 文字で始めます。スペースまたはタブで始まる行は (そのセマンティクスは定義されない場合も多い) 継続行です。ブランク行と番号記号 (#) で始まる行は無視されます。

DL - マクロの定義

マクロには 1 文字の名前を付けます。マクロは ASCII 文字から任意の文字を選んで定義できますが、定義するマクロには大文字の英字だけを使用します。ただし、sendmail によってすでに使用されている MRLG、および V などの文字は使用できません。小文字の英字と特殊記号は内部で使用されます。

マクロを定義する方法は、次の 2 通りです。

D マクロ定義の構文は次のとおりです。


DXval

ここで、X はマクロ名であり、val はその値です。スペースは使えません。マクロは、エスケープシーケンス $X を使ってほとんどの場所で挿入できます。

以下に、構成ファイルからの D マクロ定義の例を示します。


DRmailhost
Dmeng.acme.com

変数 Rmailhost の値を入れるように設定され、内部変数 m は値 eng.acme.com を入れるように設定されます。

m マクロはメールドメインを定義します。定義しなければ、ネームサービスドメインネームが最初の構成要素を除いて使用されます。たとえば、ecd.east.acme.comeast.acme.com になります。メールドメインネームを定義するさらに柔軟な方法は、L マクロ定義を使用することです。

L マクロ定義の構文は次のとおりです。


LXsearch-key

ただし、X はマクロ名であり、search-keysendmailvars データベースから検索されます。検索キーによって探し出されたエントリにある値が X に割り当てられます。

以下に、構成ファイルからの内部 L マクロ定義の例を示します。


Lmmaildomain

変数 m は、検索キーとして maildomain を使用した sendmailvars データベースの値に設定されます。sendmailvars データベースのエントリが


maildomain        eng.acme.com

の場合、m の値は eng.acme.com になります。


注 -

sendmail/etc/nsswitch.conf ファイルにある sendmailvars エントリを使用し、/etc/mail/sendmailvars ファイルと名前空間を検索する順序を決定します。


CFG - クラスの定義

アドレス書き換えルールの左辺で対応する単語のクラスを定義できます。たとえば、自分にメールを送信しないためには、このサイトのローカル名すべてのクラスを作成します。

大文字の英字の組み合わせでクラス名を選ぶことができます。小文字の英字と特殊文字はシテスムに使用されます。

クラスを定義する方法は、次の 3 通りがあります。

表 3-6 にクラス定義のさまざまな形式の構文を以下に示します。

表 3-6 構成ファイル内のクラス定義の構文

規則 

説明 

CX word1 word2

クラス X を指定された単語中の任意のものと対応させる 

FX fi1e [pattern]

file からクラス X 単語を読み込む

FX | command

command の出力をクラス X に読み込む

GXsearch_key

sendmailvars データベースから search_key を読み込み、クラス X に割り当てる

最初のフォームでは指定された単語をクラス X と対応するように割り当てます。次の例では、monetucbmonet という名前をクラス 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 

O - オプションの設定

構成ファイルから (メールプログラム用のフラグまたはコマンド行引数と混同しないように) 複数のオプションを設定できます。オプションも 1 文字で表されます。この行の構文は次のとおりです。


Oc value

これはオプション cvalue に設定します。オプションに応じて、value は、文字列、整数、ブール値 (有効な値 tTf、または F があるもの、デフォルトは「true」) 、または時間間隔などです。オプションのリストについては、sendmail 構成オプション」 を参照してください。

P - 優先順位の定義

P 制御行を使って Precedence: フィールドの値を定義できます。このフィールドの構文は次のとおりです。


Pname=num

namePrecedence フィールドにあるとき、メッセージクラスは num に設定されます。数値が大きいほど、優先順位が高くなります。0 より小さな数値では、エラーメッセージが戻されないという特殊な特性があります。デフォルトの優先順位は 0 (ゼロ) です。以下に例を示します。


Pfirst-class=0 
Pspecial-delivery=100 
Pjunk=-100

T - 信頼されるユーザーの定義

この構成行は削除されます。これは受け付けられますが無視されます。

H - ヘッダーの定義

ヘッダー行のフォーマットは H 行によって定義します。この行の構文は次のとおりです。


H[c ?c mflagsc ?]c hnamec :c htemplate  

この指定における継続行は送信メッセージに直接挿入されます。htemplate はメッセージに挿入される前にマクロ展開されます。展開しても空であれば、ヘッダー行は入れられません。疑問符で囲まれた mflags を指定すると、ヘッダーを自動的に出力させるには指定するフラグの少なくとも 1 つがメールプログラムで定義される必要があります。これらのヘッダーの 1 つが入力にあれば、これらのフラグとは関係なく出力に送られます。

RS - 書き直しルール

アドレス解析は、単純なパターンマッチングと置換システムである書き直しルールに従って行われます。sendmail は、ルールの左側 (LHS) で一致するものを探す書き直しルールセットを検索します。ルールが一致すると、その名前はルールの右側 (RHS) で置き換えられます。

書き直しルールセットはいくつかあります。書き直しセットによっては、内部で使用されて特定のセマンティクスが必要なものもあります。その他の書き直しセットは特別に割り当てられたセマンティクスを持たず、メールプログラムの定義または他の書き直しセットによって参照できます。

たとえば、Sn は、収集する現在のルールセットを n に設定します。ルールセットを再度定義すると、新しい定義が古い定義を上書きします。

R を使用してルールセットのルールを定義します。R 行の構文は次のとおりです。


Rlhs		rhs	comments

この lhs は入力に適用されるパターンです。一致すれば、入力は rhs に書き直されます。comments は無視されます。

以下に、ルールの定義の例を示します。


# handle "from:<>" special case 
R<> 		$@@				turn into magic token

1 文字以上のタブ文字でフィールドを区切らなければなりません。フィールドには空白文字を使うことができます。

M メールプログラムの定義

メールプログラムに対するプログラムとインタフェースは、この行で定義されます。フォーマットは次のとおりです。


Mc name, c {c field=value}*

ただし、name は (エラーメッセージに使用される) メールプログラムの名前で、field=value のペアはメールプログラムの属性を定義します。表 3-7 にフィールドを示します。

表 3-7 メールプログラム定義フィールド

フィールド 

説明 

A

このメールプログラムに渡す引数ベクトル 

D

メールプログラムの作業用ディレクトリ 

E

このメールプログラムに渡す行末の文字列 

F

このメールプログラムの特殊フラグ 

L

メッセージ本体の行の最大長 

M

このメールプログラムへのメッセージの最大長 

P

メールプログラムのパス名 

R

受信者名の書き直しルールセット 

S

発信者名の書き直しルールセット

V - 構成ファイルのバージョンの定義

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 がベンダとして定義されているときは、レベルの定義に使用できるのは、V0V1 だけです。


アドレス書き直しルール

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

特殊マクロ、条件文

特殊マクロはコンストラクト $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 バイトに制限されています。

構成ファイルの構築

最初から構成ファイルを構築することは、複雑な作業です。しかし、それはほとんど必要ではなく、既存のファイルを変更することにより、ほとんどすべての状況に対応できます。何をしようとしているのかを理解し、メール配信の方針を見いだすことが重要です。この節では、構成ファイルの目的を説明し、方針についていくつかのヒントを与えます。

ドメインと方針

RFC 1006 はドメインベースの命名方針について説明しています。また、RFC 822 も、この問題を扱っています。本質的に、各ホストには、明確なルートから右から左へドットで指定された疑似経路の名前を与えられます。経路の要素は物理的なネットワークではなく組織のエンティティです。

RFC 822 と RFC 976 は、あるアドレスのソートがどのように解析されるかを指定しています。ユーザーは、sendmail がこれらのルールに従うか、またはルールを無視するかを設定できます。

進め方

方針を確立したら、任意のファイルの主要部分を使用できるかどうかを判断するために、使用可能な構成ファイルを検討します。最悪の条件下でも、収集できる役に立つ情報がかなりあります。

次の段階は、ルールセット 3 を構築し、個々のメールプログラムに対してルールセットを指定することです。ルールセット 3 の構築はこの作業で最も難しい部分です。以下に、いくつかのガイドラインを示します。

ルールセット 3 を終了すると、他のルールセットは比較的単純になるはずです。ヒントが必要ならば、構成ファイルを検討してください。

書き直しルールのテスト - btフラグ

構成ファイルを構築する際、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

これで情報が多くなります。1 つの単語の名前を使用すると、数ページ分の情報が出力されます。

sendmail とネームサービスとの相互作用

「メールドメイン」は、標準の sendmail.cf ファイルによって使用される概念で、メールを直接配信するか、またはメールホストによって配信するかを判断します。ドメイン内メールは直接 SMTP 接続経由で配信され、ドメイン間メールはメールホストに送られます。

セキュリティの高いネットワークでは、ほんの少数の選ばれたホストだけが、外部宛てのパケットを生成する権限を与えられています。ホストがメールドメイン外のリモートホストの IP アドレスを持っていても、これで SMTP 接続が確立できるとは限りません。標準の sendmail.cf では次のことを仮定しています。

このように仮定すると、ドメイン間メールの配信または転送はメールホスト側の責任です。

ネームサービスに対する sendmail 要件を設定する方法

sendmail は各種の要件をネームサービスに課します。次の節で、これらの要件とその要件を満たす方法を説明します。詳細は、in.named(1M)nis+(1)nisaddent(1M)、および nsswitch.conf(4) のマニュアルページを参照してください。

ネームサービスによるメールドメイン名の設定

メールドメイン名はネームサービスドメイン名の接尾辞の1つでなければなりません。たとえば、ネームサービスのドメイン名が「A.B.C.D」ならば、メールドメイン名は次のうちのいずれかであるはずです。

メールドメイン名は、最初に設定されたときには、多くの場合ネームサービスドメインと同じになります。ネットワークが大きくなれば、ネームサービスドメインを小さく分割してネームサービスを管理しやすくすることができます。ただし、メールドメインは、一貫した別名を提供するために分割されないまま残ることがあります。

ホスト名前空間データ

ネームサービスにおけるホストテーブルまたはマップは、次の 3 種類の gethostbyname() による問い合わせをサポートするように設定しなければなりません。

名前空間内で sendmail サービスを適切に確立するには、さらにホスト名空間に関する以下の 2 つのルールに準拠する必要があります。

  1. 完全なホスト名による gethostbyname() と短いホスト名による gethostbyname() で、一致した結果を生じるようにします。たとえば、両関数がメールドメイン admin.acme.com. から呼び出される限り、gethostbyname (smith.admin.acme.com)gethostbyname (smith) は同じ結果になるようにします。

  2. 共通のメールドメイン下のすべてのネームサービスドメインに対しては、短いホスト名による gethostbyname() で同じ結果を生じるようにします。たとえば、メールドメイン smith.admin.acme.com があるとして、gethostbyname (smith) は、ebb.admin.acme.com または esg.admin.acme.com のいずれのドメインから呼び出されても同じ結果になるようにします。主なメールドメイン名は通常ネームサービスドメインより短く、この要件に各種ネームサービスに対する特殊な意味合いを与えています。

sendmail における NIS の設定方法

ネームサービスとして NIS だけを使用するときは、sendmail 使用時に事前に解決しておかなければならない設定項目を以下に示します。

メールドメイン名

NIS をプライマリネームサービスとして設定しているときは、sendmail は、自動的に NIS ドメイン名の最初の構成要素を取り除いた結果をメールドメイン名として使用します。たとえば、ebs.admin.acme.com は、admin.acme.com となります。

mailhost ホスト名

NIS のホストマップには、mailhost エントリが必要になります。

完全なホスト名

通常の NIS の設定では、完全なホスト名は、認識されません。NIS に完全なホスト名を認識させようとするよりは、sendmail.cf ファイルを編集し %l%y で置き換えて、sendmail 側からこの要件をなくしてください。こうすることによって、sendmail のドメイン間のメール検出機能をオフにできます。ターゲットとするホストの IP アドレスを取得できれば、SMTP による直接配信が試みられます。NIS のホストマップに現在のメールドメインの外部のホストのエントリが含まれていないことを確認してください。もし、それがあれば、さらに sendmail.cf ファイルをカスタマイズする必要があります。

ホストの完全名および短縮名のマッチング

前述した手順を参考にして、完全なホスト名による gethostbyname() をオフにしてください。

1 つのメールドメイン内の複数の NIS ドメイン

共通のメールドメインの NIS のホストマップは、ホストのエントリは同じである必要があります。たとえば、ebs.admin.acme.com ドメインのホストマップは、esg.admin.acme.com のそれと同じでなければいけません。もし、そうでないと、ある NIS ドメインで有効なアドレスが他の NISドメインでは無効になってしまいます。

sendmail 用に NIS および DNS を設定する方法

ネームサービスとして NIS と DNS を使用するときに、sendmail を使用する前に解決しておかなければならない設定上の問題を以下に示します。

メールドメイン名

NIS をプライマリネームサービスとして設定しているときに、sendmail は、自動的に NIS ドメイン名の最初の構成要素を取り除いた結果をメールドメイン名として使用します。たとえば、ebs.admin.acme.com の場合は、admin.acme.com となります。

mailhost ホスト名

DNS の転送機能がオンになっていれば、NIS で解決できないという照会は DNS に転送されるため、NIS ホストマップに mailhost エントリの必要はありません。

完全なホスト名

NIS が完全なホスト名を認識できなくても、DNS がそれを行います。NIS と DNS の通常の設定手順を踏んでいる完全なホスト名の要件は満たされます。

ホストの完全名および短縮名のマッチング

NIS のホストテーブルにおけるすべてのホストエントリに対して、DNS にも対応するホストエントリが存在しなければなりません。

1 つのメールドメイン内の複数の NIS ドメイン

共通のメールドメインの NIS のホストマップ中のホストのエントリは同じである必要があります。たとえば、ebs.admin.acme.com ドメインのホストマップは、esg.admin.acme.com のそれと同じでなければいけません。もし、そうでないと、ある NIS ドメインで有効なアドレスが他の NIS ドメインでは無効になってしまいます。

sendmail 用の NIS+ の設定方法

使用するネームサービスが NIS+ だけの場合、sendmail を使用する前に解決しておかなければならない設定上の問題点を以下に記します。

メールドメイン名

プライマリネームサービスとして、NIS+ を設定していれば、sendmail は、NIS+ の sendmailvars テーブル (キーと値から構成される 2 列の NIS+ テーブル) からメールドメインを検索します。メールドメインを設定するには、エントリを 1 つこのテーブルに追加する必要があります。このエントリは、キーの列に文字列 maildomain が、値の列には自分のドメイン名 (たとえば、admin.acme.com) が設定されている必要があります。NIS+ では、sendmailvars テーブルにどのような文字列でも設定できますが、メールシステムが正常に機能するように接尾辞の規則が適用されます。nistbladm を使用して、maildomail エントリを sendmailvars テーブルに追加できます。たとえば、次のようになります。


nistbladm -A key="maildomain" value=<maildomain> 
sendmailvars.org_dir.<NIS+ domain>
ここで、メールドメインは NIS+ドメインの接尾辞となることに注意してください。

mailhost ホスト名

NIS+ホスト名には、mailhost エントリが必要です。

完全なホスト名

NIS+ は、完全なホスト名を認識することができます。通常の NIS+ の設定手順を行えば、この完全なホスト名の要件は満たされます。

ホストの完全名および短縮名のマッチング

この要件を満たすには、すべてのホストテーブルでエントリをコピーするか、ユーザーネームサービスのドメイン中の全ホストのエントリをメールドメインレベルのマスターホストテーブルに入力する必要があります。

1 つのメールドメイン内の複数の NIS ドメイン

この項目を満たすには、すべてのホストテーブルのエントリをコピーするか、ユーザーネームサービスのドメイン中の全ホストのエントリをメールドメインレベルのマスターホストテーブルに入力する必要があります。これは、(論理的または物理的に) 複数のホストテーブルを 1 つのホストテーブルに結合することになるので、メールドメインを共有する複数のネームサービスドメインで同じホスト名を再使用することはできません。

sendmail 用に NIS+ と DNS を設定する方法

ネームサービスとして NIS+ と DNS を使用するときに、sendmail 使用前に解決しておかなければならない設定上の問題点を以下に記します。

メールドメイン名

プライマリネームサービスとして、NIS+ を設定していれば、sendmail は、NIS+ の sendmailvars テーブル (キーと値から構成される 2 列の NIS+ テーブル) からメールドメインを検索します。メールドメインを設定するには、1 つのエントリをこのテーブルに追加する必要があります。このエントリは、キーの列に文字列 maildomain が、値の列に自分のドメイン名 (たとえば、admin.acme.com) が設定されている必要があります。NIS+ では、sendmailvars テーブルに、どのような文字でも設定できますが、メールシステムが正常に機能するように接尾辞の規則が適用されます。nistbladm を使用して、maildomail エントリを sendmailvars テーブルに追加できます。たとえば、次のようになります。


nistbladm -A key="maildomain" value=<mail domain> 
sendmailvars.org_dir.<NIS+domain>
ここで、メールドメインは NIS+ ドメインの接尾辞となることに注意してください。

mailhost ホスト名

ネットワークがホストデータベースのソースとして NIS+ と DNS の両方を使っているときは、mailhost エントリを NIS+ あるいは DNS ホストテーブルのいずれかに置くことができます。NIS+ と DNS をホストデータベースのソースとして /etc/nsswitch.conf ファイルで指定するようにしてください。

完全なホスト名

NIS+ も DNS も完全なホスト名を認識します。通常の NIS+ と DNS の設定手順を踏めば、この項目の要件は満たされます。

ホストの完全名および短縮名のマッチング

NIS+ ホストテーブルの全ホストエントリに対して、それに対応するエントリが DNS になければなりません。

1 つのメールドメイン内の複数の NIS ドメイン

この要件を満たすには、全ホストテーブルエントリをコピーするか、ネームサービスのドメイン中の全ホストのエントリをメールドメインレベルのマスターホストテーブルに入力する必要があります。

sendmail のコマンド行引数

コマンド行引数は、コマンド行で /usr/lib/sendmail を実行するときに使用したり、あるいはメール起動スクリプト /etc/init.d/sendmail に入力できます。表 B-1 にこれらの引数を一覧表示します。以下では最も頻繁に使われる引数の一部について述べます。

通常、sendmail デーモンは次のコマンドで開始されます。

/usr/lib/sendmail -bd -q1h

b オプションは sendmail が実行中の操作モードを選択するのに使用されます。この場合デーモンモードが選択されます。選択できる他の操作モードでは、別名データベースの初期設定 (bi)、メール待ち行列の出力 (bp)、あるいは受信者の確認 (bv) を行います。これらの引数の動作は、newaliasesmailq、および mconnect で複製できます。

引数の 2 番目のセットは、待ち行列に入れられたすべてのメールが 1 時間間隔で再処理されることを示します。これは q30m を使用して 30 分に短縮できます。

Cfile 引数を使用すると、異なる sendmail 構成ファイルをテストできます。sendmail のテストやデバッグの際に有用な他のオプションには、デバッグレベルの選択 d や、詳細 (verbose) 表示モードの選択 v があります。

処理されるジョブを制限するには、q を使用できます。qRmary 引数では、mary という名前のユーザーへのメッセージだけを選択します。この引数では qSname またはメッセージ ID qInumber で 、発信者による制限も行えます。

引数は構成オプションをリセットするのに使用できます。たとえば、qQ/var/oldmail は、/var/oldmail を待ち行列ディレクトリとして使用して、sendmail を実行します。この引数で変更できる構成オプションは、次の節で詳しく説明します。

sendmail 構成オプション

表 B-2 には、 sendmail のすべての構成オプションが示されています。これらは sendmail を開始するときに o フラグを使用するか、構成ファイルで O 行を使用して設定できます。

Afile オプションは別名ファイルの位置を変更するのに使用し、通常、別名ファイルは /etc/mail/aliases に設定されます。

h# オプションを使用してホップカウントをリセットできます。ホップカウントは特定のメッセージが発信者に返送される前に、ルーティングされるホストの最大数を決定します。メールメッセージが別名ループに入ると、メッセージが異常終了する前に、メッセージが通過するホストの最大数を決定します。デフォルトのホップカウントは 30 に設定され、小さなドメインやレベルの少ない email ドメインにとっては、この設定では大きすぎる場合があります。

システム負荷の制御に役立つオプションが 2 つあります。X# オプションでは最大負荷の平均値を設定し、負荷平均が # によって指定された値以上の場合に、デーモンで着信する SMTP 接続が拒否されます。デフォルト値は 12 ですが、メールホストが負荷を処理できるようになったら、この値を増やすことができます。X0 を使用すると、すべての SMTP 接続が拒否されます。

x# オプションは、 # によって指定された負荷平均に達したとき、メールを拒否する代わりに、待ち行列に入れます。この値を調整する前に、待ち行列に入れたすべてのメールを格納できるだけの領域がサーバーにあるかどうか確認してください。

システム負荷を処理する両方のオプションは応答に遅延があるので、新しい負荷平均値で sendmail を再起動しても、すぐにはすべての負荷の問題は解決されません。

メールプログラム用のフラグ

メールプログラムの記述で設定できるフラグの完全なリストは、表 B-3 にあります。これらのフラグは構成ファイルで設定されます。

多数のユーザーが同じホストでメールを受信する場合に、m フラグではメールプログラムで、それらのメッセージをバッチ処理できます。これで応答時間が改善されます。メールがユーザーの 1 人に届かない場合、問題が生じることがあります。これがエラーを生成し、メールが再送されることになり、メールが重複して作成されることになります。メールの重複に関わる問題が深刻になりそうな場合は、構成ファイルからこのフラグを削除してください。

n フラグはメッセージの前に UNIX 形式の From 行を追加しないように選択します。これは /usr/lib/mail.local によってすでに行われているので、メールプログラムがこれを行う必要はありません。