Sun Java System Messaging Server 6 2005Q4 管理ガイド

テンプレートの置換と書き換えルールのコントロールシーケンス

置換を使用して、書き換えられたアドレスに文字列を挿入することによって、ユーザー名またはアドレスを書き換えます。この値は、使用される特定の置換シーケンスによって決まります。この節には、次の項があります。

たとえば、次のテンプレートでは、$U が置換シーケンスです。この置換シーケンスを使用することにより、書き換えられるアドレスのユーザー名部分がテンプレートの出力に挿入されます。したがって、このテンプレートで jdoe@mailhost.siroe.com を書き換えると、その出力は jdoe@siroe.com になります。つまり $U が元のアドレスのユーザー名部分 jdoe に置き換えられます。

$U@siroe.com

コントロールシーケンスは、指定した書き換えルールの適用に対して追加の条件を課します。書き換えルールのパターン部がチェックされるホストまたはドメイン仕様と一致する必要があるだけでなく、書き換えられているアドレスの他の側面も、コントロールシーケンスまたはシーケンスによる条件設定と一致する必要があります。たとえば、$E コントロールシーケンスは、書き換えるアドレスがエンベロープアドレスでなければならないことを意味します。また、$F コントロールシーケンスは、そのアドレスが前方を探すアドレスでなければならないことを意味します。次の書き換えルールは、user@siroe.com 形式の (書き換え) エンベロープの To: アドレスにのみ適用されます。

siroe.com $U@mail.siroe.com$E$F

ドメインまたはホスト仕様が書き換えルールのパターン部分と一致しても、そのルールのテンプレートの中のコントロールシーケンスによって生じる基準のすべてとは一致しない場合、書き換えルールは失敗し、適用可能なほかのルールの検索が続けられます。

表 11–4 に、テンプレートの置換とコントロールシーケンスの要約を示します。

表 11–4 書き換えルールテンプレートの置換とコントロールシーケンスの要約

置換シーケンス 

置き換える内容 

$D

一致するドメイン仕様の部分。 

$H

ホストまたはドメイン仕様 (パターンのドットの左側) の一致しない部分。 

$L

ドメインリテラル (パターンリテラルのドットの右側) の一致しない部分。 

$U

オリジナルのアドレスのユーザー名。 

$nA 

現在のアドレスの 0 の位置から左に n 番目の文字を挿入します。n を省略した場合、アドレス全体が挿入されます。 

$nX 

メールホストの 0 から左に n 番目のコンポーネントを挿入します。n を省略した場合、メールホスト全体が挿入されます。 

$0U 

オリジナルのアドレスのローカル部分 (ユーザー名) からサブアドレスを除いたもの。 

$1U 

存在する場合は、オリジナルのアドレスのローカル部分 (ユーザー名)。 

$$

リテラルのドル記号 ($) を挿入します。

$%

リテラルのパーセント記号 (%) を挿入します。

$@

リテラルのアットマーク (@) を挿入します。

$\

該当部分を小文字にします。 

$^

該当部分を大文字にします。 

$_

元の大文字と小文字を使用します。 

$=

後続の置換文字が、LDAP 検索フィルタへの挿入に適した引用の対象となるようにします。 

$W

ランダムで一意な文字列に置換します。 

$]...[

LDAP 検索 URL ルックアップ。 

$(text)

一般データベースの置換。検索に失敗すると、ルールは失敗します。 

${...}

指定したマッピングを、与えられた文字列に適用します。 

$[...] 

カスタマ提供のルーチンを起動し、結果の置換を行います。 

$&n

左から右にゼロから数えて、一致しない (またはワイルドカードの) ホストの n 番目の部分。

$!n

右から左にゼロから数えて、一致しない (またはワイルドカードの) ホストの n 番目の部分。

$*n

左から右にゼロから数えて、一致するパターンの n 番目の部分。

$#n

右から左にゼロから数えて、一致するパターンの n 番目の部分。

$nD

一致するドメイン仕様の部分で、左側の 0 から n 番目までの部分が残されます 

$nH

一致しないホスト/ドメイン仕様の部分で、左側の 0 から n 番目までの部分が残されます 

コントロールシーケンス 

書き換えルールの効果 

$1M 

チャネルが内部再処理チャネルの場合のみ適用されます。 

$1N 

チャネルが内部再処理チャネルではない場合のみ適用されます。 

$1~ 

保留状態のチャネルの照合チェックを実行します。チェックに失敗した場合、現在の書き換えルールテンプレートの処理は正常に終了します。 

$A 

ホストがアットマーク (@) の右にある場合に適用されます 

$B 

ヘッダー/本文のアドレスのみに適用されます 

$C channel

channel に送信中の場合は失敗します

$E 

エンベロープアドレスのみに適用されます 

$F 

前方を探すアドレス (例、To:) のみに適用されます 

$M channel

channel がアドレスを書き換えている場合のみ適用されます

$N channel

channel がアドレスを書き換えている場合は失敗します

$P 

ホストがパーセント記号の右にある場合に適用されます 

$Q channel

channel に送信している場合のみ適用されます

$R 

後方を探すアドレス (例、From:) のみに適用されます 

$S 

ホストがソースルートからの場合に適用されます 

$Tnewtag

書き換えルールタグを新規タグに設定します 

$Vhost

ホスト名が LDAP ディレクトリ (DC ツリー内または仮想ドメインとしてのいずれか) に定義されていない場合、失敗します。LDAP 検索がタイムアウトになると、書き換えパターンのホスト名の後の直後の文字の残りの部分は、MTA オプションの文字列 DOMAIN_FAILURE と置き換えられます。

$X 

ホストが感嘆符の左にある場合に適用されます 

$Zhost

ホスト名が LDAP ディレクトリ (DC ツリー内または仮想ドメインとしてのいずれか) に定義されている場合、失敗します。LDAP 検索がタイムアウトになると、書き換えパターンのホスト名の後の直後の文字の残りの部分は、MTA オプションの文字列 DOMAIN_FAILURE と置き換えられます。

$?errmsg

書き換えに失敗すると、デフォルトのエラーメッセージの代わりに errmsg が返されます。エラーメッセージは US ASCII 文字でなければなりません。

$number?errmsg

書き換えに失敗すると、デフォルトのエラーメッセージの代わりに errmsg が返され、SMTP 拡張エラーコードが a.b.c に設定されます。

  • a は、番号/1000000 (最初の桁)

  • b は (番号/1000)、余り 1000 (桁 2 から 4 の値)

  • c は 番号、余り 1000 (最後の 3桁の値)。

    次の例では、エラーコードを 3.45.89 に設定しています。

    $3045089?the snark is a boojum

ユーザー名とサブアドレスの置換: $U、$0U、$1U

テンプレート内にある $U はすべて、元のアドレスから抽出されたユーザー名 (RFC 822「ローカル部」) に置き換えられます。この場合、a.“b” 形式のユーザー名は “a.b” に置き換えられます。RFC2822 では、RFC 822 における古い構文の使用は推奨されていません。今後、この新しい構文の使用が必須になると考えられます。

テンプレート内にある $0U はすべて、元のアドレスのユーザー名に置き換えられます。ただし、サブアドレスおよびサブアドレスを示す文字 (+) は含まれません。テンプレート内にある $1U はすべて、元のアドレスのサブアドレスおよびサブアドレスを示す文字 (+) に置き換えられます (それらが存在する場合のみ)。$0U と $1U はユーザー名を互いに補う関係にあります。すなわち、$0U$1U と $U とは同じものです。

ホストまたはドメインと IP リテラルの置換: $D、$H、$nD、$nH、$L

$H はすべて、ルールに一致しなかったホストまたはドメイン仕様の部分に置き換えられます。また、$D はすべて、ルールに一致したホストまたはドメイン仕様の部分に置き換えられます。$nH および $nD は、通常の $H または $D の部分から左側の 0 から n 番目までの部分を残す変形体です。すなわち、$nH または $nD を使用すると、通常 $H または $D で得られる部分から左端の 1 から n 番目までの部分が省略されます。$0H と $H、および $0D と $D はそれぞれ同じものです。

たとえば、jdoe@host.siroe.com というアドレスが次のルールに一致したとします。

host.siroe.com    $U%$1D@TCP-DAEMON

このルールが適用されると、出力チャネルに TCP-DAEMON を使用する jdoe@siroe.com というアドレスが得られます。$D は一致したドメイン全体 (つまりhost.siroe.com) に置き換えられる置換シーケンスですが、この例で使われている $1D は一致したドメインの部分 1 (siroe) 以降の部分 (siroe.com) に置き換えられます。

$L は、書き換えルールに一致しなかったドメインリテラルの部分に置き換えられます。

リテラル文字の置換: $$、$%、$@

通常、$、%、および @ 文字は書き換えルールテンプレートのメタキャラクタです。これらの文字を挿入する場合は、その文字の前にドル記号 $ を付けます。すなわち、$$ は単一のドル記号 $ に、$% は単一のパーセント記号 % (この場合、パーセントはテンプレートのフィールド区切り文字として解釈されない) に、$@ は単一のアットマーク @ (同様に、フィールド区切り文字として解釈されない) に展開されます。

LDAP クエリー URL の置換 : $]...[

$]ldap-url[ 形式の置換シーケンスは LDAP クエリー URL として解釈され、LDAP クエリーの結果に置き換えられます。標準の LDAP URL では、ホストとポートが省略されます。その代わり、ホストとポートは、msg.conf ファイル (local.ldaphost および local.ldapport 属性) で指定されています。

すなわち、LDAP URL は、次のように指定されます。ここで、角括弧 [ ] は URL のオプション部分を表しています。

ldap:///dn[?attributes[?scope?filter]]

dn は検索ベースを指定する識別名で、この部分は必須です。URL のオプションである属性 (attributes)、範囲 (scope)、フィルタ (filter) は、戻される情報を指定するためのものです。書き換えルールの場合、戻される情報を指定するための属性として望ましいのは mailRoutingSystem 属性 (または同様の属性) です。範囲には、base (デフォルト)、one、または sub のいずれかを指定できます。また、フィルタには、mailDomain の値が書き換えられるドメインに一致するオブジェクトを戻すような要求を指定するとよいでしょう。

LDAP ディレクトリスキーマに mailRoutingSystem および mailDomain 属性が含まれている場合、指定アドレスの送り先となるシステムを決定する書き換えルールは、たとえば次のようになります。この例で、作成された LDAP クエリー内の LDAP URL 置換シーケンス $D は、現在のドメイン名に置き換えられます。


.siroe.com \
  $U%$H$D@$]ldap:///o=siroe.com?mailRoutingSystem?sub? \
  (mailDomain=$D)

         

この例で使われている円記号は、書き換えルールの 1 行が次の行に続いていることを示すためのものです。表 11–5 に LDAP URL 置換シーケンスの一覧を示します。

表 11–5 LDAP URL 置換シーケンス

置換シーケンス 

説明 

$$

リテラル $ 文字 

$~ アカウント

ユーザーアカウントのホームディレクトリ 

$A

アドレス 

$D

ドメイン名 

$H

ホスト名 (完全指定ドメイン名の最初の部分) 

$L

~ または _ などの特別な先頭文字を除くユーザー名 

$S

サブアドレス 

$U

ユーザー名 

MTA は、書き換えルールおよびマッピング内で実行された検索結果の URL をキャッシュするようになりました。この新しい URL 結果キャッシュは、URL_RESULT_CACHE_SIZE (デフォルト: 10000 エントリ) および URL_RESULT_CACHE_TIMEOUT (デフォルト: 600 秒) の 2 つの新しい MTA オプションによって制御されます。

一般データベースの置換: $(...)

$(テキスト) 形式の置換シーケンスは、特殊な方法で処理されます。テキスト部分は、特殊な一般データベースにアクセスするためのキーとして使われます。このデータベースは、/imta/config/imta_tailor ファイル内の IMTA_GENERAL_DATABASE オプションで指定されているファイル (通常、/imta/db/generaldb.db ファイル) で構成されています。

このデータベースは、imsimta crdb ユーティリティーを使って作成されます。「テキスト文字列」がデータベース内のエントリに一致すると、データベース内の対応するテンプレートがその文字列に置き換えられます。「テキスト文字列」がデータベース内のどのエントリにも一致しなかった場合は、書き換えプロセスが失敗に終わります。つまり、最初から何も一致しなかったのと同じ状態に戻ります。置き換えがうまくいくと、次にデータベースから抽出されたテンプレートに別の置換シーケンスが含まれていないかどうかが調べられます。ただし、再帰的参照のループを避けるために、抽出されたテンプレート内に別の $(テキスト) を含めることは禁じられています。

参照ループが発生する可能性があるからです。例として、次の書き換えルールに jdoe@siroe.siroenet というアドレスが一致した場合を考えてみます。

.SIROENET $($H)

まず、一般データベースで siroe というテキスト文字列が検索され、その結果 (見つかった場合) が書き換えルールのテンプレートとして用いられます。ここで、siroe の検索結果を $u%eng.siroe.com@siroenet. とします。この場合、テンプレートの出力は jdoe@eng.siroe.com (すなわち、ユーザー名 = jdoe、ホストまたはドメイン仕様 = eng.siroe.com) になり、ルーティングシステムは siroenet になります。

一般データベースは、正しい操作を行うためにだれでも読み取り可能でなければなりません。

指定マッピングの適用: ${...}

.SIROENET $($H) ${mapping,argument} 形式の置換シーケンスは、MTA マッピングファイルでマッピングを検索し、見つかったマッピングを適用するのに使用します。mapping フィールドにはマッピングテーブルの名前を指定し、argument フィールドにはマッピングへ渡す文字列を指定します。この置換シーケンスを使用するには、指定したマッピングが存在し、かつその出力に $Y フラグが設定されていなければなりません。マッピングが存在しなかったり、$Y フラグが設定されていない場合、書き換えは失敗に終わります。問題なく処置が行われた場合は、マッピングの結果がテンプレート内の同じ位置にマージされたあと、再び展開されます。

このメカニズムにより、さまざまな方法で MTA 書き換えプロセスを展開することができます。たとえば、アドレスのユーザー名部分を選択しながら分析したり変更したりすることができます。通常の MTA 書き換えプロセスに、このような機能はありません。

カスタマ指定ルーチンの置換: $[...]

$[image,routine,argument] 形式の置換シーケンスは、カスタマ指定ルーチンを検索して呼び出すのに使用します。UNIX では、MTA は dlopen および dlsym を使って、指定されたルーチンを共有ライブラリイメージからダイナミックにロードし、呼び出します。そのとき、そのルーチンは次の引数を伴った関数として呼び出されます。

status := routine (argument, arglength, result, reslength)

argument および result は、252 バイトの文字列バッファーです。UNIX では、argument および result は、文字列へのポインタ (たとえば、C 言語での char* のように) として渡されます。arglength および reslength は、参照によって渡される符号付きの long 型整数です。入力時に argument には書き換えルールテンプレートからの引数文字列が含まれ、arglength にはその文字列の長さが含まれます。値を返すときには、result に結果文字列が入り、reslength にその長さが入ります。次にこの結果文字列は書き換えルールテンプレートで “$[image,routine,argument]” に置換されます。routine は、書き換えルールが失敗した場合には 0 を返し、成功した場合には -1 を返します。

このメカニズムによって、書き換えプロセスの複雑な展開が可能になります。たとえば、あるタイプのネームサービスに対して呼び出しを実行し、その結果を使ってアドレスを変化させることができます。次の書き換えルールを使って、ホスト siroe.com に対して前方を探すアドレス (例: To: アドレス) のディレクトリサービス検索が次のように実行されることがあります。$F を指定すると、この書き換えルールを前方を探すアドレスだけに使用することができます。詳細は、「方向および位置に固有の書き換えルール ($B、$E、$F、$R)」を参照してください。

siroe.com $F$[LOOKUP_IMAGE,LOOKUP,$U]

jdoe@siroe.com という前方を探すアドレスがこのルールに一致すると、メモリ内に LOOKUP_IMAGE (UNIX の共有ライブラリ) がロードされ、argument パラメータとして jdoe を使って LOOKUP ルーチンが呼び出されます。その後、LOOKUP ルーチンは、John.Doe%eng.siroe.com などの別のアドレスを result パラメータに入れ、書き換えルールが適用されたことを示す値 (-1) を返します。結果文字列にパーセント記号 (「繰り返し書き換えテンプレート: A%B」を参照) が使用されていると、アドレスを書き換えるものとして John.Doe@eng.siroe.com を使った書き換えプロセスが再開されます。

UNIX システムでは、サイト提供の共有ライブラリイメージはだれでも読み取り可能でなければなりません。

単一フィールドの置換: $&、$!、$*、$#

単一フィールド置換シーケンスは、書き換えるホストまたはドメイン仕様からサブドメイン部分を 1 つ抽出するためのものです。表 11–6 に、使用可能な単一フィールド置換シーケンスを一覧にして示します。

表 11–6 単一フィールドの置換シーケンス

コントロールシーケンス 

使用目的 

$&n 

ホスト仕様 (ワイルドカードに一致しなかったまたは一致した部分) 内の n 番目の要素を表します(n=0,1,2,..,9)。要素はドット文字で区切られており、もっとも左にあるものが「要素 0」となります。要求された要素が存在しない場合は、書き換えは失敗します。 

$!n 

ホスト仕様 (ワイルドカードに一致しなかったまたは一致した部分) 内の n 番目の要素を表します(n=0,1,2,..,9)。要素はドット文字で区切られており、もっとも右にあるものが「要素 0」となります。要求された要素が存在しない場合は、書き換えは失敗します。 

$*n 

ドメイン仕様 (パターンで指定されているテキストに一致した部分) 内の n 番目の要素を表します (n=0,1,2,...,9)。要素はドット文字で区切られており、もっとも左にあるものが「要素 0」となります。要求された要素が存在しない場合は、書き換えは失敗します。 

$#n 

ドメイン仕様 (パターンで指定されているテキストに一致した部分) 内の n 番目の要素を表します (n=0,1,2,...,9)。要素はドット文字で区切られており、もっとも右にあるものが「要素 0」となります。要求された要素が存在しない場合は、書き換えは失敗します。 

jdoe@eng.siroe.com というアドレスが次の書き換えルールに一致したとします。

*.SIROE.COM     $U%$&0.siroe.com@mailhub.siroe.com

この場合、テンプレートからは「mailhub.siroe.com をルーティングシステムとして使った jdoe@eng.siroe.com」という結果が得られます。

固有文字列の置換

$W コントロールシーケンスは、大文字の英数字からなる繰り返し不可能な固有のテキスト文字列を挿入します。$W は、繰り返されないアドレス情報を作成するような場合に便利です。

ソースチャネル固有の書き換えルール ($M、$N)

特定のソースチャネルに関してのみ動作する書き換えルールを作成することができます。これは、短形式の名前に 2 つの意味が含まれるような場合に便利です。

  1. 名前が 1 つのチャネルに届くメッセージ内にある場合。

  2. 名前が別のチャネルに届くメッセージ内にある場合。

ソースチャネル固有の書き換えは、使用中のチャネルプログラムと、rulesnorules というチャネルキーワードに関連しています。書き換えを実行する MTA コンポーネントに関連付けられたチャネルに norules が指定されている場合、チャネル固有の書き換えルールチェックは行われません。そのチャネルに rules が指定されている場合は、チャネル固有の書き換えルールチェックが行われます。デフォルトのキーワードは rules です。

ソースチャネル固有の書き換えは、指定されたアドレスに一致するチャネルとは関係がありません。このタイプの書き換えは、書き換えを実行する MTA コンポーネントとそのコンポーネントのチャネルテーブルエントリにのみ依存します。

チャネル固有の書き換えルールチェックは、ルールのテンプレート部分に $N または $M コントロールシーケンスがある場合に実行されます。$N や $M に続く文字は、アットマーク (@)、パーセント記号 (%)、または後続の $N$M$Q$C$T、または $? までチャネル名と解釈します。

たとえば、$M チャネルを使用したときにチャネルが現在書き換えを行なっているチャネルでない場合は、ルールが適用されません。また、$N チャネルを使用したときにチャネルが書き換えを行なっている場合も、ルールが適用されません。複数の $M および $N 句を指定することもできます。複数の $M 句を使用した場合は、そのうちの 1 つでも一致すれば、ルールが適用されます。複数の $N 句を使用している場合は、そのうちの 1 つでも一致すれば、ルールの適用は失敗に終わります。

宛先チャネル固有の書き換えルール ($C、$Q)

メッセージをキューに入れるチャネルに依存する書き換えルールを作成することができます。これは、あるホストに対して名前が 2 つあるような場合に便利です。つまり、1 つのホストグループに認識されている名前と、別のホストグループに認識されている名前とが異なる場合です。異なるチャネルを使って各グループにメールを送ることにより、各グループに知られている名前を使ってホストを参照するようにアドレスを書き換えることができます。

宛先チャネル固有の書き換えは、メッセージを取り出して処理するチャネルと、そのチャネルに関する rules および norules キーワードに関連しています。宛先チャネルに norules が指定されている場合、チャネル固有の書き換えルールチェックは行われません。宛先チャネルに rules が指定されている場合は、チャネル固有の書き換えルールチェックが行われます。デフォルトのキーワードは rules です。

宛先チャネル固有の書き換えは、指定されたアドレスに一致するチャネルとは関係がありません。このタイプの書き換えは、メッセージのエンベロープ To: アドレスのみに依存します。メッセージがキューに入ると、まずそのエンベロープ To: アドレスが書き換えられ、メッセージの送り先チャネルが決定されます。エンベロープ To: アドレスの書き換え中、$C コントロールシーケンスや $Q コントロールシーケンスはすべて無視されます。エンベロープ To: アドレスが書き換えられ、宛先チャネルが決まると、メッセージに関連するほかのアドレスが書き換えられる際に $C および $Q コントロールシーケンスが考慮されます。

宛先チャネル固有の書き換えルールチェックは、ルールのテンプレート部分に $C または $Q コントロールシーケンスがあると実行されます。$C または $Q に続く文字は、アットマーク (@) やパーセント記号 (%)、または後続の $N$M$C$Q$T、または $? までチャネル名と解釈します。

たとえば、$Q チャネルを使用したときにチャネルが宛先チャネルでない場合は、ルールが適用されません。また、$C チャネルを使用したときにチャネルが宛先である場合にも、ルールは適用されません。複数の $Q および $C 句を指定することもできます。複数の $Q 句を使用した場合は、そのうちの 1 つでも一致すれば、ルールが適用されます。複数の $C 句を指定した場合は、そのうちの 1 つでも一致すれば、ルールの適用は失敗に終わります。

方向および位置に固有の書き換えルール ($B、$E、$F、$R)

エンベロープアドレスにのみ適用される書き換えルール、またはヘッダーアドレスにのみ適用される書き換えルールを指定したい場合があります。$E コントロールシーケンスを使うと、書き換えるアドレスがエンベロープアドレスでない場合、書き換えを実行することができなくなります。$B コントロールシーケンスを使うと、書き換えるアドレスがメッセージのヘッダーまたは本文からのものでない場合、書き換えを実行することができなくなります。これらのシーケンスはこのような効果を得る目的でのみ使用され、書き換えルールテンプレート内の任意の場所に含めることができます。

アドレスは、方向によって分類することもできます。前方を探すアドレスは、To:、Cc:Resent-to:、または宛先を参照するほかのヘッダー行またはエンベロープ行に関して生じるアドレスです。また、後方を探すアドレスは、From:Sender:、または Resent-From: といったソースを参照するものです。$F コントロールシーケンスを使うと、前方を探すアドレスである場合に書き換えルールが適用されます。$R コントロールシーケンスを使うと、後方を探すアドレスである場合に書き換えルールが適用されます。

ホストの位置に固有の書き換え ($A、$P、$S、$X)

アドレス内のホスト名の位置に基づいて適用されるようなルールを必要とする場合があります。アドレス内のホスト名は、以下の位置にくることが考えられます。

通常ホスト名は、それがどこに位置するかに関係なく、同じように処理されます。ただし、特別な処理を必要とする場合もあります。

アドレス内のホスト名の位置に基づいてマッチング動作を制御するには、以下の 4 つのコントロールシーケンスを使用できます。

ホスト名が指定した位置にない場合は、ルールの適用が失敗に終わります。これらのシーケンスは、1 つの書き換えルール内で組み合わせることもできます。たとえば、$S$A を指定すると、ルールはソースルート内のホスト名またはアットマークの右側にあるホスト名のいずれかに一致します。これらのシーケンスをすべて指定したのと、どれも指定しないのとは同じことです。すなわち、ルールはホスト名の位置に関係なく一致します。

現在のタグ値の変更 ($T)

現在の書き換えルールタグを変更するには、$T コントロールシーケンスを使用します。書き換えルールタグはすべての書き換えルールパターンの先頭に付けられ、その後、設定ファイルやドメインデータベースで書き換えルールパターンの検索が行われます。$T の直後からアットマーク、パーセント記号、$N、$M、$Q、$C、$T、または $? までの間のテキストが新しいタグとして扱われます。

タグは、特定のコンポーネントが検出されたときにアドレスの特性全体が変わるような、特殊なアドレス形式を処理する場合に便利です。たとえば、ソースルート内で internet という特別なホスト名が見つかったときに、そのホスト名をアドレスから削除し、削除後のアドレスを強制的に TCP-DAEMON チャネルにマッチングするとします。

これは、次のようなルールを使って実行できます (ローカルホストの正式な名前を localhost とする)。

internet               $S$U@localhost$Tmtcp-force|

mtcp-force|.           $U%$H@TCP-DAEMON

最初のルールは、ソースルート内で internet という特別なホスト名が見つかった場合、そのホスト名に一致します。その後、ローカルチャネルと internet とのマッチングが行われ、アドレスから internet が削除されます。そして、書き換えタグが設定されます。書き換えプロセスは続けられますが、タグに対して通常のルールが一致することはありません。最後に、デフォルトのルールがタグとともに試され、2 番目のルールに移ります。このルールでは、ほかの条件に関係なく、アドレスが強制的に TCP-DAEMON チャネルに対してマッチングされます。

書き換えに関連するエラーメッセージの制御 ($?)

MTA には、書き換えとチャネルの照合に失敗したときに表示されるデフォルトのエラーメッセージがあります。これらのメッセージは、特定の条件下で変更することができます。たとえば、だれかが Ethernet ルーターボックスにメールを送信しようとした場合などは、「不正なホストまたはドメインが指定されています」というより「ルーターがメールを受け入れられません」というメッセージを表示した方がより適切です。

特殊なコントロールシーケンスを使って、ルールの適用に失敗した場合に出力されるエラーメッセージを変更することができます。エラーメッセージを指定するには、$? シーケンスを使用します。$? の直後からアットマーク (@)、パーセント記号 (%)、$N、$M、$Q、$C、$T、または $? までの間のテキストがエラーメッセージのテキストとして扱われます。このエラーメッセージは、書き換えの結果がどのチャネルにも一致しなかった場合に出力されます。エラーメッセージの設定は記憶され、書き換えプロセスを通じて有効となります。

$? を含むルールもほかのルールと同じように動作します。特別なケースとして、$? だけを含むルールには注意してください。この場合、アドレスのメールボックスまたはホスト部分は変更されずに書き換えプロセスが終了し、ホストがそのままチャネルテーブル内で検索されます。この検索は失敗に終わり、その結果としてエラーメッセージが返されます。

たとえば、MTA 設定ファイル内に、次に示すような最終的な書き換えルールがあるとします。

. $?Unrecognized address; contact postmaster@siroe.com

この例で、認識されないホストまたはドメイン仕様は、その失敗のプロセスにおいて、Unrecognized address; contact postmaster@siroe.com というエラーメッセージを生成します。