sendmail プログラムは、構成ファイルを使用して「別名」変換と転送、ネットワークゲートウェイへの自動ルーティング、柔軟な構成を提供するメール転送エージェントです。SunOS 5.x オペレーティングシステムには、ほとんどのサイトで使用できる標準の構成ファイルが付属しています。第 2 章「メールサービスの設定と管理」では、標準のファイルを使用して電子メールシステムを設定する方法について説明しています。この章では、sendmail 構成ファイルを作成してサイトのニーズに合わせるためのカスタマイズ方法を説明します。
sendmail プログラムは、TCP/IP や UUCP など、異なるタイプの通信プロトコルを使用できます。また、SMTP サーバー、メッセージ待ち行列機能、およびメーリングリストも組み込まれています。名前の解釈は、ドメインベースの命名規則と特定の命名規則を共に処理できるパターンマッチングシステムによって行われます。
sendmail プログラムでは、ドメインベースの命名規則を使用できるほか、あいまいさを解決する古い名前構文も使用できます。また、sendmail は、異なる命名機構の間でメッセージを変換することもできます。ドメイン方式では、物理的な命名と論理的な命名との問題を分けて扱います。インターネットドメイン命名規則については、『TCP/IP とデータ通信』 を参照してください。
他のネットワーク上のホストに対してローカルとなるネットワーク名を提供するなど、特定の方法によって特殊なケースも処理できます。
sendmail プログラムには、次のような機能があります。
UNIX System V メール、UNIX バージョン 7 メール、およびインターネットメールをサポートします。
sendmail には高い信頼性があります。すべてのメッセージを正しく配信するように設計されています。どんなメッセージも完全に失われることはありません。
sendmail は、既存のソフトウェアを配信に随時使用します。
sendmail は、1 つのネットワークタイプ (UUCP や Ethernet など) に複数の接続を行う場合なども含め、複雑な環境を処理するように構成できます。sendmail は、名前とその構文をチェックし、どのメールプログラムを使用するかを判断します。
sendmail は構成ファイルを使用してメール構成を制御します。
グループは独自のメーリングリストを管理できます。各ユーザーは、ドメイン全体で有効な別名ファイル (通常、NIS または NIS+ によって管理されるドメイン全体の別名の中にある) を修正することなく自分自身のメール転送を指定できます。
各ユーザーはカスタムメールプログラムを指定して着信メールを処理することができます。こうすると、たとえば、「I am on vacation」というメッセージを返すといった機能を設定できます。詳細は、vacation(1) のマニュアルページを参照してください。
図 3-1 には、sendmail がメールシステムで他のプログラムと対話する方法を示します。
ユーザーは、メール生成プログラムおよび送信プログラムと対話します。メール送信が依頼されると、メール生成プログラムは sendmail を呼び出し、sendmail は適切なメールプログラムにメッセージを送ります。発信者の一部はネットワークサーバーであったり、またメールプログラムの一部はネットワーククライアントであるため、sendmail は、インターネットメールゲートウェイとしても使用できます。
sendmail プログラムは、管理者が定義したメールプログラムを呼び出してメッセージを配信するメッセージルーターです。sendmail はメールプログラムからメッセージを収集し、宛先のメールプログラムで必要なメッセージのヘッダーを編集し、適切なメールプログラムを呼び出して配信したり、ネットワーク送信のために待ち行列に入れたりします。ただし、ファイルにメールを送るときは、sendmail は直接配信します。メールプログラムは最小コストで追加できます。
sendmail プログラムは、次の 3 通りの方法で外部と通信します。
規約に従った引数ベクトルや終了状態を使用する
パイプのペアを使用する
TCP を通して SMTP を使用する
プロセスと通信する標準的な方法は、引数ベクトル (コマンド名と引数) を使用することです。引数ベクトルは受信者のリストを送信し、メッセージ本体は標準入力に送信されます。問題が発生すると、メールプログラムが出力するものはすべて収集され、発信者に戻されます。メッセージが送信された後、メールプログラムからの終了状態が収集され、必要ならば診断が出力されます。
SMTP プロトコルを使用して、メールプログラムとの対話的なロックステップインタフェースを実行できます。サブプロセスはまだ作成されますが、受信者の名前は引数リストを経由してメールプログラムに渡されません。代わりに、プロセスの標準入力に送信されるコマンドで一度に 1 つずつパイプを通して渡されます。標準出力に表示されるものはすべて標準 SMTP 応答コードです。
この方法は、TCP 接続を使用することを除いては、パイプを使用する SMTP に似ています。通常、TCP 接続上の SMTP を使用して別のシステム上の sendmail プロセスに接続します。メールプログラムが同じマシンにある必要がないため、これは非常に柔軟な方法です。
sendmail プログラムは mailx や mailtool などのプログラムからメッセージを収集し、宛先のメールプログラムの要求で必要な場合にメッセージヘッダーを編集し、適切なメールプログラムを呼び出して配信したり、ネットワーク送信のために待ち行列に入れたりします。
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 を SMTP モードで実行しない限り、フラグ引数の後に受信者名引数を指定できます。次に受信者名の形式を簡単に示します。
角かっこ (<>) の中の文字列は、他のすべての文字列に優先する。このルールにより、以下の例の場合、username ではなく system-name に送信し、インターネット標準に従う
username <login@system-name> |
二重引用符 (") はフレーズを引用する場合に用い、バックスラッシュ (¥) は文字を引用する場合に用います。バックスラッシュを用いると実際は、同じフレーズが異なるものとして評価されます。たとえば、user と "user" は同じですが、¥user はどちらとも異なります。
かっこ、角かっこ、および二重引用符は必ずペアになっていなければなりません。書き換えのルールはこのあとに必要な処理を制御します。
ファイルとプログラムは、正当なメッセージ受信者です。ファイルはメッセージを格納する記憶領域を提供し、プロジェクト管理や履歴に役立ちます。プログラムはさまざまな状況で受信者として便利で、たとえば、mailsort を使用してメールをソートしたり、ユーザーが不在のときに vacation プログラムで通知メッセージに応答させることができます。
ローカル名として最初の解析アルゴリズムを通して渡される名前はすべて、次の 2 つの特殊な場合に処理されます。
構成は、起動時に読み込まれる構成ファイルによって主に制御されます。メールプログラムの追加、または情報の書き換えやルーティングの変更は、再コンパイルを必要としません。構成ファイルは、マクロ定義、ヘッダー定義、メールプログラム定義、書き換えルール、オプションなどをコード化します。
マクロを使用する方法はいくつかあります。あるマクロは、sendmail がエラーメッセージの中で自分自身を識別するのに使用する名前のような、構造化されていないテキスト情報をメールシステムに送信します。また、内部では使用されず、構成ファイルで省略記法として使用されるマクロもあります。
ヘッダー宣言は、既知のヘッダー行のフォーマットを sendmail に通知します。From: 行や Date: 行など、いくつかのヘッダー行に関する情報は sendmail に組み込まれています。
ほとんどの構成済みヘッダーは、着信メッセージになければ送信メッセージに自動的に挿入されます。メールプログラムによっては抑止されるヘッダーがあります。
メールプログラムの宣言は、メールプログラムの内部名、メールプログラムに関連付けられたいくつかのフラグ、および、呼び出し時に使用される引数ベクトルを指定します。このベクトルは使用前にマクロ展開されます。
名前書き換えのルールは sendmail での名前解析の重要な部分です。これらのルールは、特定の順序で並んだパターン置換ルールのリストで、各名前に適用されます。たとえば、ルールセット 0 は使用するメールプログラムを決定します。sendmail は、解析可能な形式になるまで、メッセージを書き直します。パターンが一致すると、一致できなくなるまで、そのルールが繰り返し適用されます。
また、構成ファイルは異なるフォーマットへの名前の編集もサポートします。たとえば、次の名前を考えてみましょう。
ucsfcgl!tef |
この名前は次のようにマッピングされます。
tef@ucsfcgl.UUCP |
この結果内部構文に合わせることができます。また、特定のメールプログラムに対応して逆方向に変換することもできます。
構成ファイルから設定できるオプションもあります。これらには、各種のサポートファイルのパス名、タイムアウト、デフォルトモードなどがあります。
「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 という行はオプション T を 3d (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) でを発信者に渡される情報量は最大になりますが、このモードはほとんど必要ありません。待ち行列モード (q) は、マシンの負荷を最小にしますが、実際の配信は、最大で待ち行列の配信間隔まで遅延されます。デフォルトのバックグラウンドモード (b) はその中間となります。
中央のメールマシンは、しばしば過負荷状態になります。最もよい解決法はメールを処理するより強力なマシンを提供することですが、その負荷は、割り当てられたリソースをすべて消費するためほとんど常に拡大します。
sendmail プログラムでは負荷を制限できます。負荷を制限する目的は、長いメッセージ、多数の受信者へのメッセージ、長時間ダウンしていたサイトへのメッセージを配信するロード時間の無駄を省きます。
Ox と OX オプションは、sendmail によって発生する負荷を制限するのに使用します。オプションを使用しなければ、デフォルトで負荷制限を設定していません。これらの構成オプションは負荷平均を表す整数の引数で指定します。たとえば、Ox4 と OX8 を指定すると、負荷が 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 ファイルから制御できるモードについて説明します。使用するモードは、必要な機能とセキュリティレベルによって異なります。
デフォルトではユーザーのホームディレクトリに書き込むプログラムに配信できるように、sendmail プログラムはユーザー ID を 0 にして (setuid を root に設定して) 実行されます。sendmail がメールプログラムを実行する準備ができると、sendmail はユーザー ID が 0 であるかどうかを調べ、0 であれば、ユーザー ID とグループ ID を、構成ファイルにある u オプションと g オプションで設定されている値にリセットします。ユーザー ID とグループ ID はともに 1 (daemon) に設定されます。メールプログラムに S フラグを設定することにより、これらの値を無効にできます (信頼性があり、root で呼び出す必要のあるメールプログラムの場合)。ただし、メール処理はメールを送信するユーザーではなく root が担当します。
OF オプションは、sendmail が使用するすべての一時ファイルのモードを設定します。デフォルト値の 0600 はセキュリティの高いメールに使用され、0644 ではアクセス権が緩和されます。この 0644 モードを使用すると、(待ち行列を処理する際でも) sendmail を root として実行する必要はありません。ユーザーは、待ち行列にあるメールを読み取ることができます。
1 つの方法は、別名データベース (/etc/mail/aliases) をモード 666 にすることです。この方法を使用すると、ユーザーは任意のリストを修正できます。ただし、ユーザーが編集できるファイルに別名を書き込んで、/etc/mail/aliases からそのファイルを参照することにより、ユーザーが変更できるような別名に制限を加える場合には、次のように指定します。
alias-name::include:/filename |
この節では、構成ファイルを詳細に説明し、独自のファイルを書くためのヒントを示します。
構文解析は 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 |
これで情報が多くなります。1 つの単語の名前を使用すると、数ページ分の情報が出力されます。
「メールドメイン」は、標準の sendmail.cf ファイルによって使用される概念で、メールを直接配信するか、またはメールホストによって配信するかを判断します。ドメイン内メールは直接 SMTP 接続経由で配信され、ドメイン間メールはメールホストに送られます。
セキュリティの高いネットワークでは、ほんの少数の選ばれたホストだけが、外部宛てのパケットを生成する権限を与えられています。ホストがメールドメイン外のリモートホストの IP アドレスを持っていても、これで SMTP 接続が確立できるとは限りません。標準の sendmail.cf では次のことを仮定しています。
現在のホストは、パケットを直接メールドメイン外のホストに送信する権限がない
メールホストは、パケットを直接外部ホストに送信することが可能な認定ホストにメールを転送できる (実際には、メールホスト自身が認定ホストとなりうる)
このように仮定すると、ドメイン間メールの配信または転送はメールホスト側の責任です。
sendmail は各種の要件をネームサービスに課します。次の節で、これらの要件とその要件を満たす方法を説明します。詳細は、in.named(1M)、nis+(1)、nisaddent(1M)、および nsswitch.conf(4) のマニュアルページを参照してください。
メールドメイン名はネームサービスドメイン名の接尾辞の1つでなければなりません。たとえば、ネームサービスのドメイン名が「A.B.C.D」ならば、メールドメイン名は次のうちのいずれかであるはずです。
A.B.C.D
B.C.D
C.D
D
メールドメイン名は、最初に設定されたときには、多くの場合ネームサービスドメインと同じになります。ネットワークが大きくなれば、ネームサービスドメインを小さく分割してネームサービスを管理しやすくすることができます。ただし、メールドメインは、一貫した別名を提供するために分割されないまま残ることがあります。
ネームサービスにおけるホストテーブルまたはマップは、次の 3 種類の gethostbyname() による問い合わせをサポートするように設定しなければなりません。
mailhost
いくつかのネームサービスの構成では、自動的にこの要件を満たします。
完全なホスト名 (たとえば、smith.admin.acme.com)
多くのネームサービスの構成がこの要件を満たします。
短いホスト名 (たとえば、smith)
sendmail はメールホストに接続し外部へのメールを転送します。メールアドレスが現在のメールドメイン内であるかどうかを判定するために、gethostbyname() が完全なホスト名で呼び出されます。エントリが見つかると、アドレスは内部にあるとみなされます。
NIS、NIS+、および DNS はすべて、短いホスト名を引数にする gethostbyname() をサポートします。したがって、この要件は自動的に満たされます。
名前空間内で sendmail サービスを適切に確立するには、さらにホスト名空間に関する以下の 2 つのルールに準拠する必要があります。
完全なホスト名による gethostbyname() と短いホスト名による gethostbyname() で、一致した結果を生じるようにします。たとえば、両関数がメールドメイン admin.acme.com. から呼び出される限り、gethostbyname (smith.admin.acme.com) と gethostbyname (smith) は同じ結果になるようにします。
共通のメールドメイン下のすべてのネームサービスドメインに対しては、短いホスト名による gethostbyname() で同じ結果を生じるようにします。たとえば、メールドメイン smith.admin.acme.com があるとして、gethostbyname (smith) は、ebb.admin.acme.com または esg.admin.acme.com のいずれのドメインから呼び出されても同じ結果になるようにします。主なメールドメイン名は通常ネームサービスドメインより短く、この要件に各種ネームサービスに対する特殊な意味合いを与えています。
ネームサービスとして NIS だけを使用するときは、sendmail 使用時に事前に解決しておかなければならない設定項目を以下に示します。
NIS をプライマリネームサービスとして設定しているときは、sendmail は、自動的に NIS ドメイン名の最初の構成要素を取り除いた結果をメールドメイン名として使用します。たとえば、ebs.admin.acme.com は、admin.acme.com となります。
NIS のホストマップには、mailhost エントリが必要になります。
通常の NIS の設定では、完全なホスト名は、認識されません。NIS に完全なホスト名を認識させようとするよりは、sendmail.cf ファイルを編集し %l を %y で置き換えて、sendmail 側からこの要件をなくしてください。こうすることによって、sendmail のドメイン間のメール検出機能をオフにできます。ターゲットとするホストの IP アドレスを取得できれば、SMTP による直接配信が試みられます。NIS のホストマップに現在のメールドメインの外部のホストのエントリが含まれていないことを確認してください。もし、それがあれば、さらに sendmail.cf ファイルをカスタマイズする必要があります。
前述した手順を参考にして、完全なホスト名による gethostbyname() をオフにしてください。
共通のメールドメインの NIS のホストマップは、ホストのエントリは同じである必要があります。たとえば、ebs.admin.acme.com ドメインのホストマップは、esg.admin.acme.com のそれと同じでなければいけません。もし、そうでないと、ある NIS ドメインで有効なアドレスが他の NISドメインでは無効になってしまいます。
ネームサービスとして NIS と DNS を使用するときに、sendmail を使用する前に解決しておかなければならない設定上の問題を以下に示します。
NIS をプライマリネームサービスとして設定しているときに、sendmail は、自動的に NIS ドメイン名の最初の構成要素を取り除いた結果をメールドメイン名として使用します。たとえば、ebs.admin.acme.com の場合は、admin.acme.com となります。
DNS の転送機能がオンになっていれば、NIS で解決できないという照会は DNS に転送されるため、NIS ホストマップに mailhost エントリの必要はありません。
NIS が完全なホスト名を認識できなくても、DNS がそれを行います。NIS と DNS の通常の設定手順を踏んでいる完全なホスト名の要件は満たされます。
NIS のホストテーブルにおけるすべてのホストエントリに対して、DNS にも対応するホストエントリが存在しなければなりません。
共通のメールドメインの NIS のホストマップ中のホストのエントリは同じである必要があります。たとえば、ebs.admin.acme.com ドメインのホストマップは、esg.admin.acme.com のそれと同じでなければいけません。もし、そうでないと、ある NIS ドメインで有効なアドレスが他の 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+ は、完全なホスト名を認識することができます。通常の NIS+ の設定手順を行えば、この完全なホスト名の要件は満たされます。
この要件を満たすには、すべてのホストテーブルでエントリをコピーするか、ユーザーネームサービスのドメイン中の全ホストのエントリをメールドメインレベルのマスターホストテーブルに入力する必要があります。
この項目を満たすには、すべてのホストテーブルのエントリをコピーするか、ユーザーネームサービスのドメイン中の全ホストのエントリをメールドメインレベルのマスターホストテーブルに入力する必要があります。これは、(論理的または物理的に) 複数のホストテーブルを 1 つのホストテーブルに結合することになるので、メールドメインを共有する複数のネームサービスドメインで同じホスト名を再使用することはできません。
ネームサービスとして 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+ と DNS の両方を使っているときは、mailhost エントリを NIS+ あるいは DNS ホストテーブルのいずれかに置くことができます。NIS+ と DNS をホストデータベースのソースとして /etc/nsswitch.conf ファイルで指定するようにしてください。
NIS+ も DNS も完全なホスト名を認識します。通常の NIS+ と DNS の設定手順を踏めば、この項目の要件は満たされます。
NIS+ ホストテーブルの全ホストエントリに対して、それに対応するエントリが DNS になければなりません。
この要件を満たすには、全ホストテーブルエントリをコピーするか、ネームサービスのドメイン中の全ホストのエントリをメールドメインレベルのマスターホストテーブルに入力する必要があります。
コマンド行引数は、コマンド行で /usr/lib/sendmail を実行するときに使用したり、あるいはメール起動スクリプト /etc/init.d/sendmail に入力できます。表 B-1 にこれらの引数を一覧表示します。以下では最も頻繁に使われる引数の一部について述べます。
通常、sendmail デーモンは次のコマンドで開始されます。
/usr/lib/sendmail -bd -q1h
b オプションは sendmail が実行中の操作モードを選択するのに使用されます。この場合デーモンモードが選択されます。選択できる他の操作モードでは、別名データベースの初期設定 (bi)、メール待ち行列の出力 (bp)、あるいは受信者の確認 (bv) を行います。これらの引数の動作は、newaliases、mailq、および mconnect で複製できます。
引数の 2 番目のセットは、待ち行列に入れられたすべてのメールが 1 時間間隔で再処理されることを示します。これは q30m を使用して 30 分に短縮できます。
Cfile 引数を使用すると、異なる sendmail 構成ファイルをテストできます。sendmail のテストやデバッグの際に有用な他のオプションには、デバッグレベルの選択 d や、詳細 (verbose) 表示モードの選択 v があります。
処理されるジョブを制限するには、q を使用できます。qRmary 引数では、mary という名前のユーザーへのメッセージだけを選択します。この引数では qSname またはメッセージ ID qInumber で 、発信者による制限も行えます。
引数は構成オプションをリセットするのに使用できます。たとえば、qQ/var/oldmail は、/var/oldmail を待ち行列ディレクトリとして使用して、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 によってすでに行われているので、メールプログラムがこれを行う必要はありません。