BlackJumboDogでXMailCFGを動かす
BlackJumboDog(以下BJD)上でXMailCFGを動かすためのメモ。
ある日、ふと「自前でメールサーバーを立ててみよう」と思い立って調べてみた。
BJDは前から使っていたが、webサーバーやftpサーバーあたりを必要なときにちょこっと起動して遊んでいただけだった。
もちろん、このBJD自体にもメールサーバー機能は付いているんだけれども、何故か外部からメールを受け取るときに「認証が必要」というエラーで返品されてしまった。
色々設定を眺めてみたり検索してはみたものの、どうにも原因が分からない。
仕方なく他のメールサーバーソフトを探しているときにこのXMailにたどり着いたというわけ。
本編に入る前にちょっと説明を
メールサーバーを立てるにはDDNSサービスを利用しなければならず*1、ソフトをインストールする前にそちらの作業をやっておかなければならない。
とは言ってもそんな面倒な作業ではない。
まずはDiCE DynamicDNS Client (自宅でインターネットサーバー)を開いてDiCEというツールをダウンロードしてこよう。別にこのソフトは必須というわけではないが、これがないとIPが変わったときにいちいち手動で更新しなければならないため、非常に面倒である。また、DiCEじゃないと駄目なのか、というと、もちろんそういう訳ではないが、まあ定番と言えばこれでしょ。
このDiCEのページの真ん中辺りに、無料DDNSサービスの一覧があり、これも便利だ。「Aレコード登録」に対応していればwebサーバーやftpサーバーが立てられるし、「MXレコード登録」に対応していればメールサーバが立てられる。それ以外の部分に関しては適当に。後ろの方に「予備知識」という項目があるからそれを読めばなんとなくわかるだろうということで。
こっからが本題
さて、まずはXMailをダウンロードしよう。DownloadのページからXMail本体と、WEB上で設定できるようにするCGI集であるXMailCFGをダウンロードしてくる。
XMailの方は普通にインストールし(たとえばC:\Program Files\XMailなど)、XMailCFGはBJDで設定した「ドキュメントのルートディレクトリ」にXMailCFGというフォルダでも作ってそこへ放り込めばいいだろう。
XMailCFGをインストールしたフォルダの中にsetupというフォルダがあり、その中にupdate.batというファイルがある。これはperlがインストールされているフォルダを認識して、各cgiの先頭行にある
#!C:/usr/perl/bin/perl.exe
を書き換えてくれるものだが、BJDでは実行する必要はない。
BJDはWindowsで動いているからパーミッションの設定も必要なく(ただしwebサーバーの設定で「CGIを使用する」にチェックを入れなければならないが)、http://localhost/XMailCFG/を開くとメインページを開くことが出来る。
左側のメニューから「基本セットアップ」を開き、「XMailCFG環境設定」を開く。これは問題なく開けるはず。しかし、二つ下の「サービスの登録」が開かない。何度押しても真っ白だ。
つまり今回はこれをなんとかしようじゃないかとそういうわけだ。
結論から言うと、これはCGIが引数を受け取れていないために起こっている。
http://localhost/XMailCFG/cgi/service.cgi?installとなっているが、この場合は"install"が引数。service.cgiは、「引数が無い場合には何もせずに終わる」という仕様になっている。本当に何もせず、単にexitしているだけだから、本来こんなことやったら「ヘッダが無いぞ」って怒られてしまうところだが、BJDは何事もなかったかのように空白のページを返すだけだ。
CGIで渡されたパラメータは、GETの時は環境変数QUERY_STRINGから受け取り、POSTの場合は標準入力からCONTENT_LENGTHの長さだけ読み込んで受け取るのが一般的だと思う。たぶん。
ところが、これらのCGIの中身を覗いてみると、どうもARGVに入っている物を引数として解釈しているようだった。そんな方法があるなんて…と思ったが、ともかくBJDではその変数にはセットされないんだから仕方がない。
ARGVに引数が入っているのは分かったが、どういう風に格納されているのかが分からなかった。
よくよくページを見てみると、「XMailCFG 環境設定」のリンクはhttp://localhost/XMailCFG/cgi/cfgenv.cgi?top+1になっている。試しに、自分が借りているHPスペースに@ARGVを表示するだけのCGIを作って同じようにやってみると、$ARGV[0]にtopが、$ARGV[1]に1が入っていることが分かり、謎は全て解けた。
考えてみれば、urlencodeされた文字列の中で+はスペースを表す物であり、http://localhost/XMailCFG/cgi/cfgenv.cgi?top+1というのは要するに
$ cfgenv.cgi top 1
と同じ解釈をされてるわけだ。
そうするとあとは簡単。QUERY_STRINGをバラして@ARGVに格納してやればいいだけだ。
が、CGIファイルは107個もあるから、一個ずつ手作業でやっていたんでは日が暮れてしまう。
簡単な検索プログラムを作って調べてみたら、@ARGVを使っている物は、config.cgiかcommon_admin.cgiかfilter.common.cgiのいずれかのファイルをrequireしていることが分かった。
そこで、それら三つのファイルに
@ARGV = split(/\+/,$ENV{'QUERY_STRING'});
の記述を追加して実行してみると、見事期待通りに動作するようになった。
この行を追加する場所はどこでもかまわないが、filter.common.cgiではそのファイルの中で@ARGVを使っているため、それよりも前でなければならない。
まあそんなわけで、無事メールを受信することが出来た。