2008年09月24日

メールをトリガーにする(James)

メールの受信をきっかけに、アプリケーションで何かやりたいということは良くある話だ。

その方法は簡単に2通りあると思う。

1.アプリケーション側で、定期的にメール受信を行って、存在すれば実行する。

長所:アプリケーションの領域だけで済むので、MTAに特別な設定も要らないし、MTAの種類も選ばない。

短所:無駄にずっと動いてる。即応答を望むなら監視間隔を短くするしかない。余計、無駄な処理が発生しそう。

2.MTA側で受信した際に実行する。

長所:必要最低限の動作だけで済む。応答も良好。

短所:設定を施したメールサーバーしか使えない。アプリケーションと分離するし管理の手間が増える。


で、なんだかんだ悩んで結局2の方法を採用することにした。

それで具体的な方法を調査。

~/.forward や /etc/aliasesにごちゃごちゃ記述やProcmailを使う方法、

そういうことを行ってくれるサービスもあった。

う〜ん。どれも気が進まない。(シェルとか苦手だし、お金がかかるのは嫌だ)

で、たどり着いたのがJames

これは100% Javaで書き下ろされたMTAで存在は知っていたが、

Mailetという仕組みで、到着したメールをトリガーにMailetというプログラムを呼び出すことができることは知らなかった。

Javaは一番慣れているし、使ったことないから挑戦してみることにした。

導入してみた感想は"すげー簡単"。

単純にMTAとして機能させるだけならば、qmailやpostfixよりも断然簡単だった。

Jamesについては、強力な解説ページがあったので割愛して、

今回は作成したAntと、バウンスメールのクリーニング機能のために実装したVERPもどきのメモにする。

・Antファイル

Jamesは簡単なんだけど、独自の設定や、Mailet、Matcherなどを作成(更新)した場合は、
それらをjarファイルに固めて、更にjarファイル込みでjames.sarを作成して、
それをJamesに配備して、再起動という手順になる。

開発段階でこれらの手順を毎回するのは面倒なのでAntで上記手順を行うようにした。
他ページでも紹介されているが、実際に行ったbuild.xmlのメモ。

<?xml version='1.0' encoding='utf-8'?>
<project name="james_mta" default="deploy" basedir=".">

<property environment="env"/>

<!-- webapp base directory -->
<property name="app.home" value="."/>

<!-- Jamesを展開したディレクトリ -->
<property name="jamesdir" value="${env.JAMES_HOME}"/>

<!-- java source directory -->
<property name="dir.src" value="${app.home}/src"/>

<!-- class directory -->
<property name="dir.cls" value="${app.home}/bin"/>

<!-- lib directory -->
<property name="dir.lib" value="${app.home}/SAR-INF/lib"/>

<!-- james lib directory -->
<property name="dir.jameslib" value="${jamesdir}/lib"/>

<!-- mailetのパッケージ -->
<property name="targetname" value="jp.hoge"/>

<!-- コンパイル -->
<target name="compile">
<javac srcdir="${dir.src}" encoding="UTF-8" debug="on" optimize="off" destdir="${dir.cls}">
<classpath>
<fileset dir="${dir.jameslib}" includes="*.jar"/>
<fileset dir="${dir.lib}" includes="*.jar" excludes="${targetname}.jar"/>
</classpath>
</javac>
</target>

<!-- clean -->
<target name="clean">
<delete dir="${jamesdir}\apps\james\SAR-INF" verbose="true" />
<delete dir="${dir.cls}/jp" includeEmptyDirs="true" verbose="true" excludes=".svn" />
</target>

<!-- 配備 -->
<target name="deploy" depends="clean,compile">
<jar jarfile="${app.home}/SAR-INF/lib/${targetname}.jar" basedir="${dir.cls}" />
<jar basedir="${app.home}" destfile="${jamesdir}/apps/james.sar">
<include name="SAR-INF/**"/>
</jar>
</target>

<!-- windows用 -->
<target name="win">
<!-- <mkdir dir="./war"/> -->
<ant antfile="build_win.xml" target="deploy" />
</target>
</project>

気をつけることは、環境変数にJAMES_HOMEを設定することくらいかな?

VERPもどきは次回に。
posted by hana at 23:34| Comment(0) | TrackBack(0) | メール関連 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。