mappings ファイル内のマッピングはすべて一定の方法で適用されます。マッピングごとに異なるのは、入力文字列のソースとマッピング出力の使用目的のみです。
マッピングの動作は、常に入力文字列とマッピングテーブルから始まります。マッピングテーブルのエントリは、テーブルに表示される順に上から下へ 1 つずつスキャンされます。各エントリの左側の部分がパターンとして使用され、入力文字列は大文字/小文字の区別なくそのパターンと比較されます。
パターンには、ワイルドカード文字を含めることができます。たとえば、次のような一般的なワイルドカード文字を使用できます。アスタリスク (*) はゼロまたはそれ以上の文字と一致し、パーセント記号 (%) は 1 つの文字に一致します。ドル記号 ($) をアスタリスク、パーセント記号、スペース、およびタブの前に置くことによって、それらの記号を文字として使用できるようになります。アスタリスクまたはパーセント記号を文字として使用した場合は、それらの特殊な定義が無効になります。パターンやテンプレートを正しく認識させるために、その中のスペースやタブは文字として認識させる必要があります。ドル記号を文字として使用するには、2 重のドル記号 ($$) を使用します。この場合、1 つめのドル記号によって、2 つめのドル記号を文字として認識されるようになります。
表 10–3 マッピングパターンのワイルドカード
ワイルドカード |
説明 |
% |
1 つの文字に一致します。 |
* |
左から右への最大限の一致を使用して、ゼロ以上の文字を一致します |
後照合 |
説明 |
$ n* |
n 番めのワイルドカードまたはグロブに一致します。 |
修飾子 |
説明 |
$_ |
左から右への最低限の一致を使用します。 |
$@ |
後続のワイルドカード、またはグロブの「保存」をオフにします。 |
$^ |
後続のワイルドカードまたはグロブの「保存」をオンにします。デフォルト設定です。 |
グロブワイルドカード |
説明 |
$A% |
A 〜 Z および a 〜 z のアルファベットのうち、1 つの文字に一致します。 |
$A* |
A 〜 Z および a 〜 z のアルファベットが 0 個以上含まれた文字列に一致します。 |
$B% |
1 桁の 2 進数 (0 または 1) に一致します。 |
$B* |
0 またはそれ以上の桁数の 2 進数 (0 または 1) に一致します。 |
$D% |
1 桁の 10 進数 (0 〜 9) に一致します。 |
$D* |
0 またはそれ以上の桁数の 10 進数 (0 〜 9) に一致します。 |
$H% |
1 桁の 16 進数 (0 〜 9 または A 〜 F) に一致します。 |
$H* |
0 またはそれ以上の桁数の 16 進数 (0 〜 9 または A 〜 F) に一致します。 |
$O% |
1 桁の 8 進数 (0 〜 7) に一致します。 |
$O* |
0 またはそれ以上の桁数の 8 進数 (0 〜 7) に一致します。 |
$S% |
1 つの記号セット文字 (例: 0 〜 9、A 〜 Z、a 〜 z、_、$) に一致します。 |
$S* |
ゼロまたはそれ以上の記号セット文字、すなわち 0 〜 9、A 〜 Z、a 〜 z、_、$ に一致します。 |
$T% |
1 つのタブ、垂直タブ、またはスペース文字に一致します。 |
$T* |
ゼロまたはそれ以上のタブ、垂直タブ、またはスペース文字に一致します。 |
$X% |
$H% と同義です。 |
$X* |
$H* と同義です。 |
$[ c]% |
文字 c に一致します。 |
$[ c]* |
文字 c の不定発生に一致します。 |
$[ c1 c2 ... cn ]% |
文字 c1、c2、または cn の発生の 1 つに一致します。 |
$[ c1 c2 ... cn ]* |
文字 c1、c2、または cn の不定発生に一致します。 |
$[ c1 -cn ]% |
c1 から c n までの文字のいずれか 1 つに一致します。 |
$[ c1 -cn ]* |
c1 から cn までの文字の不定発生に一致します。 |
$< IPv4> |
ビットを無視して、IPv4 アドレスに一致します。 |
$(IPv4) |
プレフィックスビットを維持した状態で、IPv4 アドレスに一致します。 |
${IPv6} |
1 組の IPv6 アドレスに一致します。 |
グロブ内、つまり $[...] 内では、円記号 (\) は引用符となります。実際のハイフン (-) または右角括弧 (]) をグロブ内で表すには、ハイフンまたは右角括弧に円記号を付ける必要があります。
パターン内のその他の文字はすべて、文字として使用されます。特に、一重引用符や二重引用符、および括弧は、マッピングパターンやテンプレートにおいて特殊な意味を持たず、通常の文字とみなされます。このため、不正なアドレスや部分的なアドレスに対応するエントリの書き出しが簡単になります。
複数の修飾子、または修飾子および後照合を指定するには、構文にドル記号を 1 つだけ使用します。たとえば、最初のワイルドカードを、後照合そのものを保存せずに後照合するには、$@$0 ではなく $@0 を使用します。
マッピングパターンのテスト、特にパターン内のワイルドカードの動作のテストを行うには、imsimta test -match ユーティリティーを使用できます。
アスタリスクのワイルドカードは、入力文字列を左から右へスキャンすることにより、一致する対象を最大化します。たとえば、入力文字列 a/b/c をパターン */* と比較する場合、左のアスタリスクが a/b に一致し、右のアスタリスクが残りの c に一致します。
$_ 修飾子は、ワイルドカードによる照合を最小にするため、パターンの左から右に向かって、もっとも可能性の少ない一致がその一致とみなされます。たとえば、文字列 a/b/c をパターン $_*/$_* と比較した場合、左の $_* は a と、右の $_* は b/c と一致します。
IPv4 プレフィックスの照合では、IP アドレス、またはサブネットを指定し、そのあとにオプションとして、照合比較の際に有効となるスラッシュとプレフィックスのビット数を続けます。たとえば、次の例は 123.45.67.0 サブネット内にあるものに一致します。
$(123.45.67.0/24)
IPv4 照合でビットを無視する場合は、IP アドレスまたはサブネットを指定し、そのあとにオプションとしてスラッシュを付け、照合を確認する際に無視するビット数を続けます。たとえば、次の例は 123.45.67.0 サブネット内にあるものに一致します。
$<123.45.67.0/8>
次の例は、123.45.67.4 から 123.45.67.7 の範囲内にあるものに一致します。
$<123.45.67.4/2>
IPv6 照合は、IPv6 アドレスまたはサブネットを照合します。
指定したエントリのパターン比較に失敗した場合は、何の動作も行われず、次のエントリのスキャンへ移行します。比較が成功した場合は、エントリの右側の部分がテンプレートとして使用され、出力文字列が生成されます。このテンプレートによって、入力文字列がテンプレートの指示によって構成された出力文字列に置き換えられます。
テンプレート内のほとんどすべての文字が、そのまま出力文字列として生成されます。ただし、ドル記号 ($) は例外です。
ドル記号の後ろにドル記号、スペース、またはタブが続く場合は、出力文字列にドル記号、スペース、またはタブが生成されます。これらの文字を出力文字列に挿入するには、引用符を付ける必要があります。
ドル記号に数字 n が続いている場合は置換を呼び出します。ドル記号の後ろにアルファベット文字が続くものは「メタキャラクタ」と呼ばれます。メタキャラクタ自体はテンプレートで生成された出力文字列に出現しませんが、特殊な置換や処理で使われます。特殊な置換および標準処理のメタキャラクタの一覧は、表 10–4 を参照してください。その他のメタキャラクタはマッピング特有の用途に制限されています。
テンプレートの照合パターン内に $C、$E、$L または $R のいずれかのメタキャラクタがある場合、それらはマッピング処理に影響を及ぼし、処理の終了または続行を決定します。つまり、1 つのエントリの出力文字列が別のエントリの入力文字列となるような反復的なマッピングテーブルエントリを設定することができます。テンプレートの照合パターン内に $C、$E、$L、または $R のどのメタキャラクタも含まれていない場合は、$E (マッピング処理の即時終了) が行われます。
無限ループを避けるために、マッピングテーブル内のパス (文字列が渡されること) の反復回数には制限があります。前回のパスと同じか、それより長いパターンを使用してパスが反復されるたびに、カウンタは 1 増えます。文字列が直前のものより短い場合は、カウンタがゼロにリセットされます。カウンタが 10 に達すると、マッピングの反復要求は受け付けられません。
表 10–4 マッピングテンプレートの置換とメタキャラクタ
置換シーケンス |
置き換える内容 |
---|---|
$n |
左から右にゼロから数えて n 番めのワイルドカードのフィールド。 |
$#...# |
シーケンス番号の置換 |
$]...[ |
LDAP により URL 検索が行われます。結果として、置換が行われます。 |
$|...| |
指定されたマッピングテーブルを、与えられた文字列に適用します。 |
${...} |
一般データベースの置換。 |
$}domain,attribute{ |
ドメイン単位の属性にアクセスする機能を追加します。domain は該当するドメインであり、attribute はドメインに関連付けられた属性です。このドメインが存在して属性を有している場合、その初期値はマッピングの結果に代入されます。属性かドメインのどちらかが存在しない場合、マッピングエントリは失敗します。 attributes には、ドメイン LDAP 属性か、下記のように定義された特殊な属性を指定できます。 _base_dn_ - ドメインのユーザーエントリのベース DN _domain_dn_ - ドメインエントリ自体の DN _domain_name_ - ドメインの名前 (エイリアスではない) _canonical_name_ - ドメインに関連付けられた標準名 |
$[...] |
サイト提供のルーチンを起動し、結果の置換を行います。 |
メタキャラクタ |
説明 |
$C |
次のテーブルエントリからマッピング処理を続行し、このエントリの出力文字列をマッピング処理の新しい入力文字列として使用します。 |
$E |
マッピング処理をただちに終了し、このエントリの出力文字列をマッピング処理の最終結果とします。 |
$L |
次のテーブルエントリからマッピング処理を続行し、このエントリの出力文字列を新しい入力文字列として使用します。テーブル内のすべてのエントリを照合したら、もう一度最初のテーブルエントリから照合します。後続の照合エントリにメタキャラクタ $C、$E または $R がある場合には、それらのエントリが優先されます。 |
$R |
マッピングテーブルの最初のエントリからマッピング処理を続行し、このエントリの出力文字列をマッピング処理の新しい入力文字列として使用します。 |
$nA |
現在のアドレスの 0 の位置から左に n 番目の文字を挿入します。n を省略した場合、アドレス全体が挿入されます。 |
$nX |
メールホストの 0 から左に n 番目のコンポーネントを挿入します。n を省略した場合、メールホスト全体が挿入されます。 |
$?x? |
マッピングエントリが x パーセントの割合で成功します。 |
$\ |
後続のテキストを小文字にします。 |
$^ |
後続のテキストを大文字にします。 |
$_ |
後続のテキストを元々の状態で残します。 |
$= |
後続の置換文字が、LDAP 検索フィルタへの挿入に適した引用の対象となるようにして、その部分を大文字に変換します。 |
$:x |
指定したフラグが設定されている場合にのみ、一致します。 |
$;x |
指定したフラグがクリアの場合にのみ、一致します。 |
ドル記号に数字 n が続いている場合、これは、パターン内の n 番目のワイルドカードに一致するデータで置き換えられます。ワイルドカードには、0 から順に番号が付けられています。たとえば、次のエントリは入力文字列 PSI%A::B に一致し、その結果 b@a.psi.siroe.com という出力文字列を生成します。
PSI$%*::* $1@$0.psi.siroe.com |
また、入力文字列 PSI%1234::USER にも一致するので、出力文字列として USER@1234.psi.siroe.com が生成されます。入力文字列 PSIABC::DEF は、このエントリ内のパターンに一致しないため置換は行われません。つまり、このエントリから出力文字列は生成されません。
メタキャラクタ $\ は後続のテキストを小文字に変換し、メタキャラクタ $^ は後続のテキストを大文字に変換します。また、メタキャラクタ $_ は、後続のテキストを元の大文字または小文字の状態で残します。たとえば、これらのメタキャラクタは、マッピングを使って大文字または小文字の区別が有効なアドレスを変更する際に役立ちます。
メタキャラクタ $C、$L、$R、および $E は、マッピング処理を終了するかどうか、またいつ終了するかなど、マッピング処理に影響を与えます。これらのメタキャラクタには、次の効果があります。
$C は現在のエントリの出力文字列をマッピング処理の新しい入力文字列として使用し、次のエントリからマッピング処理を続行します。
$L は、現在のエントリの出力文字列をマッピング処理の新しい入力文字列として使用し、次のエントリからマッピング処理を続行します。一致するエントリが見つからない場合には、もう一度そのテーブルの最初のテーブルエントリから照合を開始します。後続の照合エントリにメタキャラクタ $C、$E または $R がある場合には、それらのエントリが優先されます。
$R は、現在のエントリの出力文字列をマッピング処理の新しい入力文字列として使用し、テーブルの最初のエントリからマッピング処理を続行します。
$E はマッピング処理を終了し、このエントリの出力文字列が最終結果となります。デフォルト設定は $E です。
マッピングテーブルのテンプレートは、左から右にスキャンされます。一般データベースの置換やランダム値で制御されるエントリなど、「成功」または「失敗」するエントリに $C、$L、または $R のフラグを設定するには、メタキャラクタ $C、$L、または $R をエントリの成功または失敗する部分の左側に配置します。これを行わないと、エントリの残りの部分が失敗した場合、フラグが表示されません。
マッピングプローブの中には、特殊なフラグセットを持つものがあります。これらは設定可能なフラグであり、それらが存在するかどうかは $: および $; テストの一般的なマッピングテーブル機能を使用して確認されます。$:x はフラグ x が設定されている場合のみ、エントリを一致させます。$:x はフラグ x がクリアの場合にのみ、エントリを一致させます。特定のマッピングテーブルに適用される特殊なフラグについては、各マッピングテーブルの説明を参照してください (表 17–2 の $A、$T、$S、$F、および $D を参照)。
フラグチェックが成功するとエントリが成功して終了するが、フラグチェックが失敗するとマッピング処理を続行する必要があるという場合、エントリはフラグチェックの左側に $C メタキャラクタを配置し、フラグチェックの右側に $E フラグを配置する必要があります。
マッピングテーブルのエントリにメタキャラクタ $?x? がある場合は、これによって、x パーセントの割合でエントリが「成功」します。残りの割合でエントリは「失敗」し、マッピングエントリの入力文字列は変更されずにそのまま出力文字列となります(マッピングによっては、エントリが失敗したこととエントリが一致しなかったこととは、必ずしも同義ではない)。x には、成功率を実数で指定します。
たとえば、IP アドレスが 123.45.6.78 であるシステムが、自分のサイトに大量の SMTP 電子メールを送信していて、このメールの量を少し減らしたいとします。この場合、PORT_ACCESS マッピングテーブルを次のように使用できます。たとえば、接続の 25 パーセントのみを許可し、残りの 75 パーセントを拒否するとします。次のマッピングテーブル PORT_ACCESS は、$?25? を使用し、$Y のあるエントリを 25 パーセントの割合で成功させます (すなわち、接続を許可)。エントリが失敗する残りの 75 パーセントの割合では、そのエントリの最初の $C によって MTA は次のエントリからマッピングを続行しますが、接続試行は拒否され、Try again later (あとでもう一度試行してください) という SMTP エラーメッセージが表示されます。
PORT_ACCESS TCP|*|25|123.45.6.78|* $C$?25?$Y TCP|*|25|123.45.6.78|* $N45s$ 4.40$ Try$ again$ later |
$#...# 置換は、MTA シーケンスファイルに保存されている値を増やし、その値をテンプレート内に入れます。たとえば、マッピングテーブルを使ってファイル名を生成するときなど、マッピングテーブルの出力に固有の修飾子があることが望ましい場合に、シーケンス番号付きの固有文字列を生成することができます。
次のいずれかの構文を使用できます。
$#seq-file-spec|radix|width|m# |
$#seq-file-spec|radix|width# |
$#seq-file-spec|radix# |
$#seq-file-spec# |
必須の引数 seq-file-spec は、既存の MTA シーケンスファイルの完全なファイル指定です。オプションの引数 radix で出力するシーケンス値の基数を、width で出力する桁数を指定します。デフォルトの基数は 10 ですが、-36 ~ 36 の範囲内の基数も使用できます。たとえば、基数 36 では 0 ~ 9、A ~ Z の文字からなる値を使用することができます。デフォルトでは、シーケンス値は自然幅で出力されますが、大きな桁数を指定すると、桁数に合わせるために数値の左側に 0 が追加されます。桁数を明示的に指定する場合は、基数も明示的に指定する必要があります。
オプションの引数 m はモジュラスです。この 4 番目の引数が指定されている場合、挿入される値はファイル mod m から取得されたシーケンス番号です。デフォルトでは、モジュラスの処理を行わないようになっています。
上記にあるように、マッピングで参照される MTA シーケンスファイルはすでに存在するものでなければなりません。MTA シーケンスファイルを作成するには、次のコマンドを使用します。
touch seq-file-spec |
または
cat >seq-file-spec |
マッピングテーブルを使ってアクセスされるシーケンス番号ファイルは、誰でも読み取り可能でないと正常に操作できません。また、このようなシーケンス番号ファイルを使用するには、MTA ユーザーアカウント (imta_tailor ファイルで nobody として設定) を持つことが必要です。
$]ldap-url[ の形式の置換は、特殊な方法で処理されます。ldap-url は LDAP クエリ URL として解釈され、LDAP クエリの結果が置換されます。ホストとポートが省略された標準の LDAP URL が使用されます。ホストとポートは、代わりに LDAP_HOST オプションと LDAP_PORT オプションで指定されます。LDAP URL は次のように指定する必要があります。
ldap:///dn[?attributes[?scope?filter]]
上記の角括弧 ([ と ]) は、URL のオプションの部分を示します。dn は検索ベースを指定する識別名で、この部分は必須です。URL の attributes、scope、および filter の各オプションを指定すると、より細かい情報が返されます。つまり、attributes では、この LDAP クエリに一致する LDAP ディレクトリエントリから返される属性を指定します。scope には、base (デフォルト)、one、または sub のいずれかを指定できます。filter には一致するエントリの特徴を記述します。
特定の LDAP URL 置換シーケンスは、LDAP クエリ URL 内で使用できます。
$|mapping;argument| 形式の置換は、特殊な方法で処理されます。MTA は、MTA mappings ファイル内の mapping で指定されている補足的なマッピングテーブルを探し、その補足的なマッピングテーブルへの入力文字列として argument を使用します。この補足的なマッピングテーブルは既存のものであり、置換が成功した場合にはその出力文字列に $Y フラグを設定しなければなりません。この補足的なマッピングテーブルが存在しなかったり、または $Y フラグを設定しなかった場合には、補足的なマッピングテーブルの置換は失敗し、元のマッピングエントリも失敗とみなされます。元の入力文字列が出力文字列として使用されます。
マッピングテーブルの置換を行うマッピングテーブルエントリで $C、$R、または $L などの処理制御メタキャラクタを使用する場合は、処理制御メタキャラクタをマッピングテーブルテンプレート内のマッピングテーブル置換の左側に配置します。そうしないと、マッピングテーブルの置換が「失敗」したときに、処理制御メタキャラクタが処理されません。
${text} 形式の置換は、特殊な方法で処理されます。text 部分は、一般検索テーブルやデータベースにアクセスするための鍵として使われます。データベースは、imsimta crdb ユーティリティーにより生成されます。text がテーブルで一致すると、テーブル内の対応するテンプレートがその文字列に置き換えられます。text がテーブル内のエントリに一致しない場合は、入力文字列がそのまま出力文字列として使用されます。
一般検索テーブルを使用している場合、MTA オプションの use_text_databases の下位ビットを設定する必要があります。つまり、奇数に設定する必要があります。general.txt を変更した場合は、imsimta cnbuild を使用してコンパイルし、imsimta reload を使用して再読み込み可能なデータを再読み込みすることで、MTA 設定にコンパイルする必要があります。
一般データベースを使用している場合、データベースが適切に動作するためには、データベースは誰にでも読み取り可能でなければなりません。
一般テーブルの置換を行うマッピングテーブルエントリで、$C、$R、または $L などの処理制御メタキャラクタを使用する場合は、処理制御メタキャラクタをマッピングテーブルテンプレート内の一般テーブル置換の左側に配置します。そうしないと、一般テーブルの置換が「失敗」したときに、処理制御メタキャラクタが処理されません。
$[image,routine,argument] 形式の置換は特殊な方法で処理されます。image、routine、argument の各部分は、カスタマ提供のルーチンを見つけて呼び出すために使用されます。UNIX では、MTA は dlopen および dlsym を使って共有ライブラリ image からルーチン routine をダイナミックにロードし、呼び出します。そのとき、ルーチン routine は、次の引数を伴った関数として呼び出されます。
status = routine (argument, arglength, result, reslength) |
argument および result は、252 バイトの文字列バッファーです。argument および result は、文字列へのポインタ (たとえば、C 言語での char* のように) として渡されます。arglength および reslength は、参照によって渡される符号付きの long 型整数です。入力時、argument にはマッピングテーブルテンプレートの argument 文字列が含まれ、arglength にはその文字列の長さが含まれます。値を返すときには、result に結果文字列が入り、reslength にその長さが入ります。この結果文字列が、マッピングテーブルテンプレート内の $[image,routine,argument] に置き換わります。routine は、マッピングテーブルの置換が失敗した場合には 0 を返し、成功した場合には -1 を返します。置換が失敗した場合は、通常、元の入力文字列がそのまま出力文字列として使用されます。
サイト提供ルーチンの置換を行うマッピングテーブルエントリで、$C、$R、または $L などの処理制御メタキャラクタを使用する場合は、処理制御メタキャラクタをマッピングテーブルテンプレート内のサイト提供ルーチン置換の左側に配置します。そうしないと、マッピングテーブルの置換が「失敗」したときには、処理制御メタキャラクタが処理されません。
サイト提供ルーチンの呼び出し機構によって、MTA のマッピング処理はさまざまな方法で拡張することができます。たとえば、マッピングテーブル PORT_ACCESS または ORIG_SEND_ACCESS 内で、ロード監視サービスへの呼び出しを行い、その結果を使って接続やメッセージを受け入れるかどうかを決定することができます。
image (サイト提供の共有ライブラリイメージ) は、誰でも読み取り可能でなければなりません。
一般的なマッピングテーブル機能で、Unicode 文字の値から UTF-8 文字列を生成できます。次の形式の Unicode メタキャラクタ列があるとします。
$&A0A0,20,A1A1&
この場合、A0A0、20 および A1A1 の位置にある文字を含む UTF-8 文字列が生成されます。