xmail.dojo.jp
 コマンド実行機能

XMail には、メッセージの到着をトリガーとして各種のコマンドを実行する機能が搭載されています。このページはそれらについての説明を行っています。ただし、実際にこの機能を利用するためには専用の管理ツールを利用することをすすめます。

なお、フィルタ処理については "フィルタ機能" ページも参照してください。



コマンド実行機能とは?


XMail におけるコマンド実行機能は、XMail によるメッセージングサービスを拡張するための仕組みです。XMail はメッセージの受信または送出にあたり、外部プログラムまたは内部機能を起動して任意の追加処理を行うことができます。

XMail は、そのプログラムサイズが小さいことからも推察できるように、比較的にシンプルなアプリケーションです。他のメールサーバと比較し、XMail はそれ自身では決して特別に高機能だとは言えません。XMail は基本機能の充実に徹したアプリケーションです。

しかし、XMail のコマンド実行機能は極めて柔軟であるため、その活用によってサービス全体の質を他のどのメールサーバにも負けないものにすることが可能です。たとえば、以下はこのコマンド実行機能によって可能になるものです。

  Top ↑

コマンド実行機能の種類


XMail のコマンド実行機能には以下の種類があります。

■カスタムドメイン処理

カスタムドメイン処理は、特定のドメインあてにメッセージが到着したときに任意のコマンドを実行するものです。ただし、そのドメインは XMail のローカルドメイン以外でなければなりません。

メッセージが到着したとき、XMial はそのあて先ドメインが MailRoot/domains.tab 内に存在するかどうか調べますが、そこにみつからない場合、XMail はそのドメイン名に関連付けられたカスタムドメイン処理のための定義があるかどうかを調べ、あればその定義内容に従ったコマンドを実行します。

■コマンドエイリアス

コマンドエイリアスは、カスタムドメイン処理のユーザ版で、ローカルドメインの特定のユーザ名あてにメッセージが到着したときに任意のコマンドを実行するものです。ただし、そのユーザは "存在しないユーザ" である必要があります。

SMTP セッションの冒頭で XMail はあて先アドレス(RCPT TO:)がローカルユーザ中に存在するかどうかを調べますが、ドメインはローカルであるもののユーザが存在しない場合、XMail はそのあて先アドレスに関連付けられたコマンドエイリアスの指定を検索し、それが存在すればそこで定義されているコマンドを実行します。

■カスタムユーザ処理(mailproc.tab 処理)

カスタムユーザ処理は、XMail の特定ドメインの任意ユーザまたは特定ローカルユーザあてにメッセージが到着したときに任意のコマンドを実行するものです。この処理は mailproc.tab という特別な名前のファイルで処理内容が定義されるので、本サイトでは "mailproc.tab 処理" と呼ぶことがあります。

■フィルタ処理

フィルタ処理は、インバウンド処理においては SMTP セッション中に、またはその終了後にローカルユーザのメールボックスにメッセージが最終的に格納されるその直前に、アウトバウンド処理においては SMTP セッションを開始するその直前に、それぞれ任意のコマンドを実行するものです。

  Top ↑

カスタムドメイン処理


カスタムドメイン処理のセットアップは以下のようにします。ただし、ローカルドメイン以外のドメイン dojo.jp あてにメッセージが届いたときにコマンドを実行するものとします。

  1. MailRoot/custdomains ディレクトリ内に dojo.jp.tab という名前のテキストファイル(コマンド定義ファイル)を作成し、その内部にコマンドを記述します。コマンドの詳細は後述します。

  2. 準備完了です。コマンド定義ファイルを作成するとそれは直ちに有効になります。XMail を再起動する必要はありません。

なお、MailRoot/custdomains ディレクトリ内に dojo.jp.tab が存在しない場合でも、.jp.tab または .tab というファイルが存在する場合はそこに記述されたコマンドが実行されます。すなわち、コマンド定義ファイル名の先頭にドットがある場合、後尾にそれ自身を含むすべての名前のファイルがそこにあるものとみなされます(詳細は後述)。

■コマンド定義ファイルの名前付けルール

コマンド定義ファイルの名前は以下のようにします。

すなわち、コマンド定義ファイルには以下の種類があります。

(ドメイン名).tab
.(ドメイン名).tab
.tab

ただし、(ドメイン名) には複数のドメイン階層が含まれることがあります。たとえば、dojo.jp ドメインを対象にする場合、その名前には jp トップレベルドメインと dojo サブドメインとが含まれるので、具体的には以下のコマンド定義ファイルが存在する場合に処理が実際に行われることになります。

.dojo.jp.tab
.jp.tab
.tab

■話はわかりました。で、結局どれが実行されますか?

対象ドメイン名に完全に一致するコマンド定義ファイルやそのドメインをサブドメインに含むドメインに対する定義ファイルなどが同時に存在する場合、コマンドは以下のように実行されます。

  1. 完全に一致する定義ファイルがあればそれだけが実行され、他のすべてのファイルは無視されます。

  2. 部分一致のファイルの場合、ドメイン階層の多いファイル名から順に評価が行われ、最初に一致したものが実行され、他のすべてのファイルは無視されます。たとえば dojo.jp ドメインを対象とする場合にコマンド定義ファイルとして .jp.tab と .tab とが存在すれば .jp.tab が実行され、.tab は無視されます。

■コマンドフォーマット

コマンド定義ファイル内に記述するコマンド行は以下のようにします。

"コマンド" (tab) "引数またはマクロ" (tab) ...... (改行)

"コマンド" には XMail の内部コマンド、OS の内部コマンドや外部コマンド、シェルスクリプト(UNIX)やバッチファイル(Windows)、標準入出力に対応した任意のプログラムなどを指定できます。また、"引数またはマクロ" は任意の回数繰り返すことができます。さらに、コマンド行そのものも繰り返すことができます。

■XMail のマクロ

コマンド行には XMail 独自のマクロを指定することができます。これは内部コマンドや外部プログラムを実行するときにそれらの引数として所定の情報を渡すためにあります。以下のマクロのうち、@@xxx のように @@ から始まるものは XMail 1.22 まででサポートされていた形式で、新しいバージョンでも引き続きサポートされています。

$(FROM) または @@FROM
メッセージの送信者アドレス(SMTP セッション時の MAIL FROM: の値)。

$(RCPT) または @@RCPT
メッセージのあて先アドレス(SMTP セッション時の RCPT TO: の値)。

$(FILE) または @@FILE
メッセージファイルのディスク上の絶対パス。

$(MSGID) または @@MSGID
XMail が生成したメッセージの識別番号(ID)。

$(MSGREF) または @@MSGREF
メッセージの SMTP リファレンス値。

$(TMPFILE) または @@TMPFILE
メッセージファイルのテンポラリファイル名。

$(USERAUTH) または @@USERAUTH
SMTP 認証時のユーザ ID。

■コマンドの種類

コマンドには external、filter、redirect、lredirect、smtprelay、smtp があり、それぞれ以下のように使用します(大文字でも可)。

external
外部コマンドを起動します。詳細は次項 "外部プログラムの実行方法" を見てください。

filter
外部コマンドを起動します。external コマンドとの違いは、external コマンドがただ一つの終了コードをセットするのに対して、filter コマンドの場合は "フィルタ処理" の場合と同様の終了コードをセットできることです。詳細は "フィルタ処理" を見てください。

redirect
到着メッセージを内部ドメインや外部ドメインまたは特定のメールアドレスあてにリダイレクトします。

"redirect"   "somedomain.com"
foo@dojo.jp あてのメッセージを foo@somedomain.com へリダイレクトします。

"redirect"   "cop@somedomain.com"
すべての dojo.jp ドメインあてのメッセージを cop@somedomain.com へリダイレクトします。

lredirect
到着メッセージを内部ドメインや外部ドメインまたは特定のメールアドレスあてにリダイレクトします。コマンドの指定方法は redirect の場合と同じですが、redirect コマンドと lredirect コマンドとの動作が異なる点は、redirect コマンドが最初の送信者アドレスをそのままにしてリダイレクトするのに対し、lredirect コマンドではそれを新たなものに置換するところにあります。

smtprelay
到着メッセージを他の SMTP サーバにそのままリレーします。リレー先サーバはセミコロンで区切って複数の指定が可能です。

"smtprelay"   "192.168.0.10;10.0.0.1:8025"
到着メッセージを IP アドレスが 192.168.0.10 のコンピュータの TCP/25 に向けてリレーします。それに失敗した場合は引き続き 10.0.0.1 のコンピュータの TCP/8025 に向けてリレーします。サーバリストの先頭に # 文字をつけるとリレー先がランダムに選択されるようになります。

"smtprelay"   "192.168.1.100,NeedTLS=1,OutBind=192.168.10.1"
すべてのメッセージをローカルホストが持つ IP アドレス 192.168.10.1 からリモートホスト 192.168.1.100 に転送しますが、SSL/TLS での接続を試み、相手先がそれに対応できない非 SSL 接続を継続します。(NeedTLS=1)。

smtp
そのまま通常の SMTP 処理プロセスに進みます。

■外部プログラムの実行方法

XMail の内部コマンド external や filter を利用して外部プログラムを起動する場合は以下のようにコマンド行を記述します。

"external(filter)" (tab) "優先度" (tab) "タイムアウト秒数" (tab) "コマンドのパス" (tabi) "引数またはマクロ" ...... (改行)

優先度
プロセスの優先度を 0(通常)、-1(非優先)、+1(優先)のいずれかで指定します。

タイムアウト秒数
XMail が外部プログラムからの戻り値を待ち続ける秒数を指定します。0 を指定すると外部プログラムを起動するとただちに XMail は次のプロセスに進みます。コマンドに与えるマクロに @@FILE を使用する場合は十分なタイムアウト秒数を指定する必要があります。さもなければ外部プログラムによるメッセージファイルに対する処理が完了する前にファイルそのものが XMail によって削除されてしまうかもしれません。

[XMail 1.19 以降] 外部プログラムが終了コードを 16 にして終了すると、XMail はコマンド定義ファイル中のそれ以降のコマンド行を実行せず、カスタムドメイン処理を終了します。

コマンドのパス
実行するコマンドを指定します。

引数またはマクロ
実行するコマンドに与える起動オプションや引数、マクロなどのすべてをダブルクオートて区切って一つずつ連続指定します。以下は perl を使用し、c:/temp/task.pl でメッセージファイルを処理する場合のコマンド行サンプルです。

"external"   "0"   "30"   "perl"   "c:/temp/task.pl"   "$(FILE)"
  Top ↑

コマンドエイリアス


コマンドエイリアスのセットアップは以下のようにします。ただし、foo@dojo.jp というあて先アドレスのメッセージが XMail に到着したときにコマンドが実行されるものとします。すなわち、dojo.jp は XMail のローカルドメインであるものの、そこに foo という名前のアカウントが存在しないことがこのコマンドエイリアスが実行される前提になります。

  1. MailRoot/cmdaliases ディレクトリ内に dojo.jp というサブディレクトリが存在することを確認します。このサブディレクトリは、XMail 付属のコントロールコマンドを利用してドメインの作成を行えば自動的に作成されているはずですが、もし存在しなければ手作業で作成します。

  2. MailRoot/cmdaliases/dojo.jp 内に foo.tab というテキストファイル(コマンド定義ファイル)を作成し、その内部にコマンドを記述します。

  3. 準備完了です。コマンド定義ファイルを作成するとそれは直ちに有効になります。XMail を再起動する必要はありません。

■コマンドフォーマットなど

コマンド定義ファイル内に記述するコマンドのフォーマットやその実行方法はカスタムドメイン処理の場合とまったく同じです。

  Top ↑

カスタムユーザ処理(mailproc.tab 処理)


カスタムユーザ処理のセットアップは以下のようにします。

  1. 特定ドメイン(dojo.jp)の任意のユーザあてにメッセージが到着したときにコマンドを実行したい場合、MailRoot/domains/dojo ディレクトリ内に mailproc.tab という名前のテキストファイル(コマンド定義ファイル)を作成し、その内部にコマンドを記述します。

  2. 特定ローカルユーザ(foo@dojo.jp)あてメッセージの到着と同時にコマンドを実行したい場合、MailRoot/domains/dojo/foo ディレクトリ内に mailproc.tab を作成します。

  3. 準備完了です。コマンド定義ファイルを作成するとそれは直ちに有効になります。XMail を再起動する必要はありません。

■コマンドフォーマット

mailproc.tab ファイル内に記述するコマンドのフォーマットはカスタムドメイン処理の場合と同じです。

"コマンド" (tab) "引数またはマクロ" (tab) ...... (改行)

■XMail のマクロ

カスタムユーザ処理ではカスタムドメイン処理と同様に $(FROM)、$(RCPT)、$(FILE)、$(MSGID)、$(SGREF)、$(TMPFILE)、$(USERAUTH) などのマクロを使うことができ、これに $(RRCPT) が追加されています。マクロ $(RRCPT) はメッセージの本当のあて先アドレスです。というのも、$(RCPT) はエイリアス名であるかもしれず、実際にメッセージが格納されるアカウントを指しているとは限らないからです。

■コマンドの種類

コマンドにはカスタムドメイン処理と同様に external、filter、redirect、lredirect、smtprelay を使うことができ、これらに mailbox が追加されています。コマンド mailbox は到着メッセージをこのローカルユーザのメールボックスに格納します。すべてのコマンドは大文字でも記述できます。

以下は到着メッセージを foo@dojo.jp に転送するためのコマンド定義ファイルのサンプルです。ただしメッセージのコピーをローカルのメールボックスにも残す場合のものです。

"redirect"   "foo@dojo.jp"
"mailbox"

■コマンドの実行順に注意

以下のサンプルは上記と同様に転送時にメッセージのコピーを残すものですが、もし "フィルタ処理" でメッセージファイルに何らかの変更が加えられていた場合、変更済みのメッセージが転送されます。"フィルタ処理" は個別アカウントのメールボックスにメッセージが格納されるその直前に実行されるからです。オリジナルを転送したい場合は mailbox コマンドを redirect コマンドのあとに記述してください。

"mailbox"
"redirect"   "foo@dojo.jp"
  Top ↑

フィルタ処理


フィルタ処理のセットアップについては "フィルタ機能" ページを見てください。


  Top ↑
Copyright(c) xmail.dojo.jp.
All rights reserved.