フィルタ機能 |
このページでは XMail のコマンド実行機能のうちフィルタ機能の概要とそれを実際に利用するための方法とを説明しています。コマンド実行機能全般については "コマンド実行機能" のページを参照してください。
なお、インターネットには XMail 専用の特定目的フィルタプログラム(スクリプト)が多数公開されており、フィルタ機能を実際にセットアップするにはそれらのツールを利用するのが近道です。
XMail におけるフィルタ機能は、XMail によるコマンド実行機能の一部としてメッセージングサービスを拡張するための仕組みです。XMail はメッセージの受信または送出にあたり、外部プログラムを起動して任意の追加処理を行うことができます。それがフィルタ機能です。
XMail のコマンド実行機能は極めて柔軟であるため、うまく活用すればサービス全体の質を他のどのメールサーバにも負けないものにすることが可能です。フィルタ機能はとくに強力で、たとえば以下の機能を XMail の標準機能に追加することができます。
XMail でサポートするフィルタ機能には、SMTP セッション時に行われるものとそうでないものとの区別があります。
■オンラインフィルタ機能
オンラインフィルタ機能では、インバウンド SMTP セッションにおいて SMTP コマンドを中断して一連のフィルタを実行できます。XMail では以下の 3 種類があります。
|
上記の機能名は執筆者による勝手な命名です。他の識者は別の命名をするかもしれないことに留意してください。"SMTP DATA 前処理機能" は機能内容からするとおかしな命名であると執筆者自身が感じていますが、フィルタ機能が「メッセージ本体を受け取る前と後」に分けられていることから命名し、そのままにしています。
■オフラインフィルタ機能
オフラインフィルタ機能では、インバウンド SMTP セッションが終了してあて先ローカルユーザのメールボックスにメッセージが格納されるその直前に、またはアウトバウンド SMTP セッションが開始されるその直前に一連のフィルタを実行できます。
|
XMail と SMTP クライアントとの SMTP セッションにおいて、クライアントが RCPT TO: コマンドを送信してきたその直後に一連のフィルタ処理をオンラインのまま実行するのが "SMTP RCPT 後処理" です。
■フィルタ定義ファイル
"SMTP RCPT 後処理" のセットアップは MailRoot/filters.post-rcpt.tab ファイルで行います。1行の定義は以下のフォーマットです。
"コマンド" (tab) "引数またはマクロ" (tab) "引数またはマクロの繰り返し" (改行) または "!フラグ" (tab) "コマンド" (tab) "引数またはマクロ" (tab) "引数またはマクロの繰り返し" (改行) |
■フラグの種類
フラグはコマンドの実行を制御するもので、以下のものがあります。
aex
このフラグを付加すると、もしクライアントが SMTP 認証をパスしていればそのコマンド行を実行しません。
wlex
このフラグを付加すると、もしクライアントの IP アドレスが SMTP ホワイトリスト(MailRoot/smtp.ipprop.tab または MailRoot/smtp.hnprop.tab)に定義されたものに一致すればそのコマンド行を実行しません。
たとえば、"!aex,wlex" "perl" ...... のような指定をすることになります。
■マクロの種類
オンラインフィルタ機能では以下のマクロ文字列がサポートされます。マクロは、コマンドを実行するときにそれらの引数として所定の情報を渡すためにあります。以下のマクロのうち、@@xxx のように @@ から始まるものは XMail 1.22 まででサポートされていた形式で、新しいバージョンでも引き続きサポートされています。
$(FROM) または @@FROM
メッセージの送信者アドレス(SMTP セッション時の MAIL FROM: の値)。
$(RCPT) または @@CRCPT
メッセージのあて先アドレス(SMTP セッション時の RCPT TO: の値)。
$(FILE) または @@FILE
メッセージファイルのディスク上の絶対パス。ただし、"SMTP RCPT 後処理" を実行する時点ではメッセージファイルについての情報は何も含まれません。
$(USERAUTH) または @@USERAUTH
SMTP 認証時のユーザ ID。
$(REMOTEADDR) または @@REMOTEADDR
クライアントの IP アドレスと TCP ポート番号。
$(LOCALADDR) または @@LOCALADDR
XMail 側の受け付けインターフェースの IP アドレスと TCP ポート番号。
■コマンド終了時の終了コード
実行されるコマンドはその終了時に特定の数値を終了コードとしてセットすることでそれに対応した処理を XMail に行わせることができます。サポートされる終了コードは以下の通りです。
16
コマンドが 16 をセットして終了すると、XMail はその後の定義行を実行せずに "SMTP RCPT 後処理" を終了します。
3
コマンドが 3 をセットして終了すると、XMail はその SMTP セッションを強制終了し、メッセージの受け取りを拒否します。
■してはいけないこと!
コマンドの引数にマクロ $(FILE) または @@FILE を与えれば XMail が保存しているメッセージ情報ファイルをコマンドから編集することができますが、その場合、データフォーマットを変更しないようにする必要があります。XMail による情報ファイルは以下のフォーマットです。
1行目: IPアドレスやポート番号、ドメイン名、接続時間などの情報が含まれます。 2行目: SMTP ドメイン名があります。 3行目: SMTP メッセージ ID があります。 4行目: MAIL FROM: アドレスがあります。 5行目: RCPT TO:アドレスがあります。 6行目以降: 複数の RCPT TO:アドレスがあればそれが続きます。 ‥‥‥ <<MAIL-DATA>> ‥‥‥ (この行以降にメッセージデータが入ります) |
XMail と SMTP クライアントとの SMTP セッションにおいて、クライアントが DATA コマンドを送信してきたその直後に一連のフィルタ処理をオンラインのまま実行するのが "SMTP DATA 前処理" です。
"SMTP DATA 前処理" のセットアップは MailRoot/filters.pre-data.tab ファイルで行います。その他の情報や準備作業は "SMTP RCPT 後処理" の場合とまったく同じです。
XMail と SMTP クライアントとの SMTP セッションにおいて、クライアントがメッセージ本体データの送信を完了した直後に一連のフィルタ処理をオンラインのまま実行するのが "SMTP DATA 後処理" です。
"SMTP DATA 後処理" のセットアップは MailRoot/filters.post-data.tab ファイルで行います。その他の情報や準備作業は "SMTP RCPT 後処理" の場合とまったく同じです。
インバウンド処理において XMail と SMTP クライアントとの SMTP セッションが終了し、受け取ったメッセージを最終的にクライアントのメールボックスに格納するその直前に一連のフィルタ処理を行うのが "SMTP セッション終了後処理" です。セットアップは以下のようにします。
■フィルタ定義ファイル(MailRoot/filters.in.tab)
MailRoot/filters.in.tab が "SMTP セッション終了後処理" のための設定ファイル(フィルタ定義ファイル)です。フィルタ定義ファイルでは、送信者アドレスやあて先アドレス、送信元や送信先のコンピュータの IP アドレスなどによりフィルタ処理の対象となる SMTP セッションの条件と、フィルタ処理を実行するさいに参照するフィルタ起動ファイルの名前とを定義します。
フィルタ定義ファイルでは 1 行を以下のように定義します。
"送信者アドレス" (tab) "あて先アドレス" (tab) "送信者のIPアドレス" (tab) "あて先のIPアドレス" (tab) "フィルタ起動ファイル名" (改行) |
前から 4 個のフィールドでフィルタ処理の対象となる SMTP セッションの条件を、最後のフィールドでフィルタ処理を実行するさいに参照するフィルタ起動ファイルを定義します。同様にして複数の定義を繰り返すことができます。
送信者アドレス
メッセージの送信者アドレス(SMTP セッション時の MAIL FROM: の値)です。*@domain.com のようにワイルドカードを指定することができます。* のみの指定はすべての送信者アドレスにマッチします。
あて先アドレス
メッセージのあて先アドレス(SMTP セッション時の RCPT TO: の値)です。送信者アドレスと同様にワイルドカード指定が可能です。
送信者の IP アドレス(リモートアドレス)
SMTP クライアントの IP アドレスを指定します。指定は 0.0.0.0./0 や 192.168.1.0/24 のようにネットマスクを含めて書きます。何も指定しなければ 0.0.0.0/0 を指定したものとみなされます(すべての IP アドレスにマッチ)。
あて先の IP アドレス(ローカルアドレス)
メッセージのあて先の IP アドレスで、指定方法は送信者の IP アドレスの場合と同様です。
フィルタ起動ファイル名
フィルタの起動が決定したときに参照するファイルの名前を指定します。このファイルは MailRoot/filters ディレクトリで検索されます。
以下のサンプルは XMail の関連ツールである XMailCFG の標準インバウンドフィルタを参照するための定義です。
"*" "*" "0.0.0.0/0" "0.0.0.0/0" "XMailCFG_common_in.tab" |
この MailRoot/filters/XMailCFG_common.in.tab から起動される実在のフィルタプログラムはウイルススキャンやコンテンツフィルタリングなど複数の機能を持っていますが、あなたが処理内容ごとに個別のフィルタプログラムを用意するのであれば、フィルタ定義ファイルの内容はたとえば以下のようになるでしょう。
"*" "*" "0.0.0.0/0" "0.0.0.0/0" "antivirus.tab" "*" "*" "0.0.0.0/0" "0.0.0.0/0" "logging.tab" |
この場合、すべてのメッセージはまず MailRoot/filters/antivirus.tab で定義するフィルタ処理を行い、そこで特別な戻り値(後記参照)がセットされない限り、引き続き MailRoot/filters/logging.tab によるフィルタ処理を行うという内容になります。
■フィルタ起動ファイル(MailRoot/filters/*.tab)
フィルタ起動ファイルは、フィルタ処理を実行するコマンド(プログラムやスクリプト)を起動するための定義ファイルです。すべてのフィルタ起動ファイルは MailRoot/filters ディレクトリ内に置かれなければなりません。
フィルタ起動ファイルの 1 行のフォーマットは以下のようにします。
"コマンド" (tab) "引数またはマクロ" (tab) "引数またはマクロの繰り返し" (改行) |
■マクロの種類
オフラインフィルタ機能では以下のマクロ文字列がサポートされます。マクロは、コマンドを実行するときにそれらの引数として所定の情報を渡すためにあります。以下のマクロのうち、@@xxx のように @@ から始まるものは XMail 1.22 まででサポートされていた形式で、新しいバージョンでも引き続きサポートされています。
$(FROM) または @@FROM
メッセージの送信者アドレス(SMTP セッション時の MAIL FROM: の値)。
$(RFROM) または @@RFROM
メッセージの送信者がローカルユーザのエイリアス名である場合にその本当の送信者アドレス。
$(RCPT) または @@RCPT
メッセージのあて先アドレス(SMTP セッション時の RCPT TO: の値)。
$(RRCPT) または @@RRCPT
メッセージのあて先アドレスがローカルユーザのエイリアス名である場合にその本当のあて先アドレス。
$(REMOTEADDR) または @@REMOTEADDR
クライアントの IP アドレスと TCP ポート番号。
$(LOCALADDR) または @@LOCALADDR
XMail 側の受け付けインターフェースの IP アドレスと TCP ポート番号。
$(FILE) または @@FILE
メッセージファイルのディスク上の絶対パス。
$(MSGID) または @@MSGID
XMail が生成したメッセージの識別番号(ID)。
$(MSGREF) または @@MSGREF
メッセージの識別番号のリファレンス値。
$(TMPFILE) または @@TMPFILE
メッセージファイルのテンポラリファイル名。
$(USERAUTH) または @@USERAUTH
SMTP 認証時のユーザ ID。
■コマンド終了時の終了コード
フィルタ起動ファイルから起動されるコマンドは、その実行結果として 4、5、6、7 またはそれらに 16 を加えた以下のいずれかの戻り値をセットして終了しなければなりません。16 を加えた戻り値をセットするのは、すべてのフィルタ処理がそこで完了したことを XMail に通知する場合です。
4 または 20
4 の場合、メッセージを廃棄し、そのさい送信者に通知せず、凍結メッセージも残さないことを XMail に通知します。20 をセットすると、フィルタ定義ファイルやフィルタ起動ファイルに残りのコマンド定義があってもそれらのすべてをスキップしてフィルタ処理を完了することになります。メッセージファイルが存在しなくなった以上、20 をセットすることには意味がないように思われますが、たとえば統計処理などはその後でも行うことはできます。
5 または 21
5 の場合、メッセージを廃棄し、そのさい送信者には通知せず、もし MailRoot/server.tab の RemoveSpoolErrors 変数の値が 0 または無指定の場合には凍結メッセージとしてそのコピーをスプールに残すことを XMail に通知します。同時にフィルタ処理をそこで終了させるときは 21 をセットします。
6 または 22
6 の場合、メッセージを廃棄し、そのさい廃棄の事実を送信者に通知することを XMail に通知します。通知メッセージはデフォルトでは XMail 既定のものになりますが、もしフィルタコマンドから $(FILE).rej($(FILE) はマクロの値です。@@FILE でも可) という名前のファイルを出力し、その内部に 1 行のテキストを記述していればそちらを送信者に通知します。通知メッセージはカスタマイズできるということです。同時にフィルタ処理をそこで終了させるときは 22 をセットします。
16
16 の場合、すべてのフィルタ処理がそこで完了したことを XMail に通知します。XMail は次の処理ステップに進みます。
7 または 23
7 の場合、メッセージファイルに変更が加えられたことを XMail に通知します。同時にフィルタ処理をそこで終了させるときは 23 をセットします。
上記以外の戻り値がセットされた場合、XMail はそのまま次のステップに進みます。すなわち、フィルタ起動ファイル中に残りのコマンド行があればそれが実行され、ない場合はフィルタ処理のすべてがそこで終了します。
なお、コマンドによりメッセージファイルに変更を加える場合、そのデータ構造を変更してはいけません。具体的には、メッセージファイルの先頭から 5 行の内容を変更してはいけません。この部分には SMTP セッションによって得られた XMail の管理情報があります。6 行目にはそこの後(7行目以降)がメッセージデータであることを示す標識文字列 <<MAIL-DATA>> があり、次行からメッセージそのもの(ヘッダとボディ)が続きます。また、メッセージファイルを保存するときはすべての改行コードを CR+LF(Windows 標準の改行コード) にしなければなりません。
■コマンドは何が使える?
フィルタ起動ファイルから実行するコマンドには、OS の内部コマンドやコンソールモードで動作するほとんどすべてのプログラムまたはスクリプト(バッチファイル)を使うことができます。
インターネットには XMail 対応の多くのフィルタプログラムが公開されていますが、その多くは perl スクリプトです。perl には莫大な過去の資産があり、現在では同じスクリプトを UNIX でも Windows でもほとんど同様に動作させられる環境ができていることがその理由でしょうか。
XMail が外部へメッセージを中継するためにリモートサーバとの間で SMTP セッションを開始するその直前に一連のフィルタ処理を行うのが "SMTP セッション開始前処理" です。
"SMTP セッション開始前処理" のセットアップでは、フィルタ定義ファイルが MailRoot/filters.out.tab となり、フィルタ起動ファイルが MailRoot/filters/*.tab ファイルとなります。その他の情報や準備作業は "SMTP セッション終了後処理" の場合とまったく同じです。
|