BlatJ で CSV添付ファイル付きフォームメール送信

 友人のウェブデザイナーが、Windowsサーバーのことで苦労していたようなので、ちょっとだけお手伝いすることになった。話を聞いてみたら簡単そうだと思ったのですぐに解決するかと思ったのだが、久しぶりに苦労する結果となった。

 UNIXサーバーで動いていたはずのフォームメールのCGIがWindowsサーバーで動かなくて困っているとのことだった。
 当然のことながら、perl + sendmail を使ったCGIになっていたが、Windowsサーバーには perl は入っていたけど sendmail が入っていないのでスクリプトを修正しないと動かないという話である。
 sendmail の代わりに入っていたのは BlatJ というソフトだということだが、スクリプトの記述方法も異なるので、どこをどう変えれば動くようになるのか検討つかない。さぁ、どうするか?

 Windowsサーバーでメール送信しようと思ったら、ASP + BASP21 を使うのが一番簡単で応用範囲も広い。ActivePerl を使えば Perl から BASP21 も使える。
 でも今回は BlatJ で動かすのが必須条件ということで、一から調べることになった。

 まずは BlatJ をVectorからダウンロードして、サーバーにインストールした。バージョンは1.7だった。
 sendmail との記述の違いを調べてみると、BlatJの場合は To や Subject 等のパラメータをつけて起動してあげなければならないということなので、そういう記述に変えれば動くものだと思っていた。sendmail のものを BASP21 に変える時は、いつもそれでうまくいっている。

 メールを送るところまではうまくいったのだが、添付ファイルをつけて送らなければならないということだったので、そこで手詰まりになった。
 たしか添付ファイルには、

 Content-Disposition: attachment; filename=ファイル名

 という記述が入っていたはずなので、それをつけて送ってみたけど、本文に入ってしまって添付にならない。
 実際に送信&受信が成功たメールと失敗したメールを比べてみると、ヘッダーの部分に決定的な相違点があることに気づいた。添付ファイルにするためには、ヘッダー情報に、

 Content-Type: Multipart/Mixed; boundary=[区切り文字列]

 という記述がなければならないのだった。とすると、BlatJ では無理なのではないか?という疑問が頭をよぎったのだが、サーチエンジンで検索してみると、BlatJ で添付ファイル付きメールを送るには、 -attach オプションを付けることで可能になるということが分かった。
 ところが先にインストールした BlatJ のヘルプを見ると、-attach オプションがなかったので、そこで初めて「もしかしたらバージョンが古いのではないか?」ということに気づいた。
 -attach オプションに対応しているバージョンは 1.8以上だということだったので、それに入れ替えて試してみたら、ヘッダーに Content-Type: Multipart/Mixed が付くようになった。でも結果は同じで添付ファイル化にはならなかった。
 よくよくヘッダーを見てみると、 Content-Type: Multipart/Mixed の他にもうひとつ、 Content-type: text/plain というのがあったので、それが原因ではないかと思った。
 さらに調べてみると、それは BlatJ のバグであることが分かり、そしてとうとう最新版(1.8.2+J2.5)を見つけてダウンロードしたら、うまくいった。

 今回は、最新バージョンの確認を怠ったという初歩的なミスで、遠回りしてしまった。Vector にそんな古いバージョンのものがアップされていたとは知らず、やはり常に最新バージョンと変更履歴を調べることを怠ってはいけなかったのだ。


<今回の教訓>
・面倒でも必ず、最新版と変更履歴をダウンロードすること。
・ウェブデザイナーやウェブプログラマー向けに、動作確認用としてのレンタルサーバーサービス(アドバイス付き)を追加すること。
・何度もトライ&エラーを繰り返す前に、Mandal-Art等を使って実現のための条件を書き出してみてから始めること。