TOPへ
起票 2005.2.20/更新 2005.2.20
 目次へ  
   


qmailの転送設定

 

 



MTA:qmailの転送設定 

qmailでは受信したメールの配送先(保存ディレクトリ)を2通りの設定パラメータで指定します。
 1)ユーザー共通の設定 : 起動スクリプト/var/qmail/rc 内に記述します
 2)個々のユーザの設定 : $HOME/.qmail に記述します。

前者ではスクリプト中に
 qmail-start ./Maildir/ splogger qmail 
こういう記載をします。
./Maildir/はqmailの推奨なので、皆さんインストール時に恐らく書き換えてると思います。これが共通の配信先です。
個々のユーザごとに設定する場合は
 $HOME/.qmail
に書きますね。
ここに
./Maildir/
と書けば起動スクリプトに書いたのと同じ動作になりますね。$HOME/Maildir/new/ に配信されるようになります。

で、他のアドレスに転送をする場合はここ .qmail へ
 &転送先アドレス
と書き加えるだけで転送される様になります。このままだと転送して終わってしまうので、転送してから保存する場合には./Maildir/を含めて
 ./Maildir/
 &XXXX@XXXXX.XXX.XX
こんな順序で保存しつつ転送させることが出来ます。

さて、

バウンスも可能でbouncesayingという補助コマンドを起動させて
 |bouncesaying 'コメント' 条件判定コマンド
という書式で動作します。

ここで条件判定コマンドが出てきましたが、そう言えば転送をする場合、条件に基づいて制御するにはどうすれば良いのでしょうか?
私はメール転送にぜひ条件判定をしたいので、転送方法はかなり気になります。
条件判定に沿って転送させる場合でも .qmail の中に書きます。
補助コマンドであるcondredirectと引数としての判定コマンドで転送するかしないかを決める事ができます。
 |condredirect 転送先 条件判定コマンド
こんな書式です。

但し、条件判定コマンドにはメール送信者の情報が$SENDERだけしか渡せません。qmailの基本的なスタンスが着信のアドレスを調べるところに軸足があるみたいです。発信者によって転送するかどうか決めたいのに・・・・

私が一番使いたい機能は発信者によって、または発信ドメインによって転送を制御する(またはバウンスさせる)というものです。特に発信ドメインを切り分ける事が重要です。
環境変数がSENDERしか使えない以上、発信ドメインを判定するのはどうも一筋縄では行かないみたいです。
ではフルアドレス判定は使えるのか?
$SENDER="abcd@xxxxx.com" という条件式を使うもののどう書いてみても思い通りに動作してくれません。何が悪いのかもデバッグできないのでよくわかりません。デバッグもどきとしてバウンスの引数にこの辺の変数を持ってきてバウンスされたメールの表示をみたりして調べて見ましたがよくわからないのであちこちを調べてみました。
でも転送の条件設定についてあまり触れられていない(というか、見つけられないだけなのか?)みたいでした。とにかくここをなんとか実装させてみたいと思います。
基本は
 |condredirect
これでOKだと思うので条件の書き方をつめなくてはいけません。

さて、ここからが思案どころです。
Linuxでのプログラミングをした経験はありません。現状ではどうやれば良いのか全然わかりません。
Perlの解説書はありますが、書いたことはありません。さすがにqmailの判定文のところにPerlスクリプトを書くのはちょっと気が引けるかな。
そうするとCで書いてコンパイル・・・・Cで入出力関数のソースを書くくらいは簡単ですが、LinuxのCってライブラリなんかはどうやって使うのかな?よくわかりません。
シェルスクリプトならちゃんと動いてくれるのかな?

と悩んだ末、シェルスクリプトをちょっとだけ書いてみました。
とりあえず /tmp/chkSender という名前で次のスクリプトを書いたとします。
引数は2つ、引数から括弧<>の中だけを抜き出してもう一つの引数と比較するだけのものです。

#!/bin/sh
filnename=$1
filename=${filename#\<}
filename=${filename%\<}
if test $file = $2
then
 exit 0
else
 exit 1
fi

chmod +x /tmp/chkSender
としてから

.qmailで
./Maildir/
|condredirect xxx@xxxxx.net /tmp/chkSender $SENDER yyyyy@yyyyyyy.yyy

と書いてみます。
受信して、yyyyy@yyyyyy.yyyが送信者の場合は0が帰るので、xxx@xxxxx.netへ転送するという動作になります。
condredirectは条件判定プログラムが0を返すと転送して終了、0以外または何も返さないと転送せず次の行へ進む仕様です。
http://mirror.nucba.ac.jp/mirror/qmail/man/man1/condredirect.html 参照
合致したら転送しない様にするにはスクリプトの判定を変えたりして調整しても良いが、条件結果を差し替えるexceptコマンドを借りて
 |condredirect xxx@xxxxx.net except /tmp/chkSender $SENDER yyyyy@yyyyyyy.yyy
と書けばスクリプトは上記のままで動作します。
とりあえずこれで試してみていますが、不具合もなく順調に動作しております。

Linuxでの自己流の調整は始めてですがこんな感じでいいのでしょうか。
ともあれ、結果オーライで上出来かなと自分では思っておりますが。
あと、条件判定を伴い転送する、またはバウンスさせると、そこで.qmailは終わってしまい、次の動作はキャンセルされます。condredirecto や bouncesayingを使う以上どうにもできません。


−−−−−−−−−−−−−−−−っていう記事を書いたのは確か2000年だったかな。2年前。
その後いろいろ試してみたけどPerlでかいたスクリプトを用意して、それを呼び出した方があきらかにいろんな事できますよ。
最初はメールの受信と共にPerlを呼び出すには抵抗があったけどぜんぜん問題ない。
これまで受信メールのドメイン判定やら、転送させるにあたりPerlでメールの中身を解析して、要約して添付ファイルのチェックをしてから携帯に転送させたりとか、そんなものを作って運用してきました。
あとはメール投稿掲示板ってのも作ってみました。(スパムしか届いてないけど・・・・・)
みんな同じところにセットしたPerlの仕掛けです。


書ける人はPerlでどうぞ。 2005.2.20/