16.5.Mailetを使ってみよう
16.5.1.メールレットが動作する仕組み
まず第一に、Jamesが受け取った時点でメールレットというプログラムが実行される仕組みを抑えておきましょう。
Jamesには[プロセッサ]というものがあります。これはメールを受け取って処理をする単位と考えればよいでしょう。と、いってもなかなかイメージが沸いて来ないと思うので、実際の例を見てみます。
下の図1はJamesのプロセッサの階層構造をあらわしています。

Jamesがメールを受け取ると、一番上の[root]プロセッサに渡されます。メールを渡された[root]プロセッサは、あらかじめ用意しておいたブラックリストによってスパムメールかそうでない正当なメールかを判断します。スパムメールと判断された場合にはそのメールは[spam]プロセッサに渡されることになります。一方で正当なメールと判断された場合には[trancport]プロセッサにメールは渡されます。
次に[tranceport]プロセッサはローカルのユーザ宛てかどうかを判断し、ローカルのユーザ宛ての場合はユーザのメールBOXに保存します。それ以外だった場合には[err]プロセッサにメールを渡します。
このようにJamesがメールを受け取ると、プロセッサによって条件判断が行われ、その条件にあったプロセッサへメールが渡されてそこで処理または次の判断が行われて別のプロセッサに渡されるというように処理が進んでいきます。
この処理の流れの中で、条件判断を行うのが[Matcher]と呼ばれるクラスです。さらに次のプロセッサにメールを渡したり、ユーザのメールBOXに保存したりするのが[Mailet]です。この[Matcher]と[Mailet]は共にJavaのクラスとして定義されており、これを拡張する[Matcher]や[Mailet]をユーザが自ら作成することも可能なのです。つまり、ユーザの意図した条件やそれに伴うユーザ独自の処理を行わせることが可能になります。
また、ここで紹介したJamesがメールを受け取ってからの流れはすべてconf.xmlの中に記述されている設定ですので、この流れは自由に変更することが可能です。
16.5.2.サーバ時間取得のメールレット
それでは、何よりメールレットを使ってみようということで、Jamesにメールを送信するとサーバの現在時刻が書かれた短いメッセージを送信者に送る[ServerTime ]というメールレットを使ってみましょう。
実は[ServerTime]のメールレットはJamesに標準で実装されているメールレットなので、私たちはある条件の場合に[ServerTime]メールレットを実行するように、conf.xmlの中に記述を加えればよいだけです。
それでは、以下のように[transport]プロセッサの記述の中に以下のようにして[ServerTime]を呼び出す記述を追加してみましょう。
| config.xml | |
|
225行目あたり
<processor name="transport">
<mailet match="SubjectIs=getTime" class="ServerTime"/>
↑この一行を追加
| |
この追加した一行の意味は「メールのSubjectが[getTime]だった場合には、[ServerTime]メールレットを実行せよ。」というものです。このたった一行でsubjectが[getTime]のメールが送られた場合にはServerTimeメールレットによってサーバの時間が取得されその送信者にサーバの時間が書かれたメールが自動的に送信されます。
それでは、実際に[ServerTime]メールレットの実行を確認してみましょう。
前に作成したユーザ宛てに[getTime]というSubjectのメールを送信すると、見事にサーバの現在時間が書かれたメールが帰ってくると思います。
ちなみにconf.xmlを書き換えたらJamesの再起動をお忘れなく!
16.5.3.メールの最後にメッセージをつけるメールレット
今度はJamesが受け取ったメールの最後にメッセージをつける[AddFooter]メールレットを紹介します。この機能は有名なHotmailを使ってメールを送信するとメールの一番最後に宣伝のメッセージがはいるアレのようなものです。
この場合もやはり設定は簡単ですが、先ほどと違って[<text>]というタグを内部に持ちます、そしてこのタグの中に書かれたメッセージをメールの最後に付け加えてくれるのです。
| config.xml | |
|
225行目あたり
<processor name="transport">
<mailet match="RecipientIsLocal" class="AddFooter">
<text>このメールはJamesが受け取りました。</text>
</mailet>
1行目
<?xml version="1.0"?>
を↓に変更
<?xml version="1.0" encoding="Shift_JIS"?>
| |
この設定では「ローカルユーザに送信されたメールに[AddFooter]Mailetを実行せよ。」という具合になります。ただし[Addfooter]Mailetを使用するためには、メッセージに追加する「文字列」を指定しなければなりません。そこで、その文字列を<mailet>タグの中に<text>タグを作ってこの中に追加するメッセージを記述します。
ただし、追加するメッセージを日本語で指定する場合にはconfig.xmlの先頭のXML宣言部に文字コードの指定を追加してやる必要があります。Windows環境では「encoding="Shift_JIS"」をLinuxなどUNIX環境では「encoding="euc_jp"」を追加することになります。
そしたら、Jamesを再起動し前に作ったユーザ宛てに適当な内容のメールを送信してみましょう。
すると、見事に「このメールはJamesが受け取りました。」という一文がメールの最後に追加されているのがわかります。
16.5.4.簡易メーリングリストを作る
次にメールレットだけをつかって、簡単なメーリングリストをつくってみます。ただし、Jamesにはもう少し高度なメーリングリストのための機能が用意されていますので、この方法はあくまでも簡易です。
今回使うMailetは[Forward]です。このメールレットを使用すると、Jamesが受け取ったメールを他のメールアドレスへ転送することができます。さらに転送できるメールアドレスは複数指定可能なのです。
| config.xml | |
|
225行目あたり
<processor name="transport">
<mailet match="RecipientIs=list@localhost" class="Forward">
<forwardto>iihito@localhost</forwardto>
<forwardto>kazuto@localhost</forwardto>
</mailet>
| |
この設定例では「list@localhost」宛てにメールが送信された場合には、[iihito@localhost]と[kazuto@localhost]へ自動的に転送するようになります。もう少し一般的に説明すると[RecipientIs]Matcherによって送信先(メーリングリストのアドレス)を指定し、その送信先に送られたメールを[Forward]Mailetで処理するようにします。さらに、[Forward]Mailetにメールを転送する先のアドレスを渡すために[forwardto]タグを使ってメールアドレスを指定します。
ちなみに、上のような[list@localhost]というユーザは作成しなくてもここに記述するだけで送信可能です。ただし[kazuto@home-net]と[iihito@home-net]はユーザを作成していないとダメです。
※間違ってもRecipientIs=list@localhostと<forwardto>の部分のメールアドレスを同じものにしないでください。同じにするとメールが無限ループになり、たいへんなことになってしまいます。
なお、ここで紹介した物は一部ですので、もっと詳しく知りたいと思う方はApacheJamesProjectsやApacheJamesの日本語訳サイトのドキュメントなどを参考にしてみてください。
このように、Jamesに付属しているMailetを使用するだけでもいろいろな処理が行えるのですが、やはりJamesを折角使ったのならオリジナルのMailetを使ってみたいと思うのは私だけでしょうか?と、いうことで次の章ではオリジナルのMailetを作成しJamesで使用する方法を紹介します。
>>> 16.6.オリジナルのMailetを作成しよう <<<
|