その方法は簡単に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もどきは次回に。