- PR -

Qmailでの転送設定について

1
投稿者投稿内容
takesan
会議室デビュー日: 2003/06/19
投稿数: 3
投稿日時: 2008-11-05 15:45
自己アドレスがxxx@yyyy
転送先アドレスがaaa@bbbb

------.qmailの内容------(*は伏せ字)
/home/vpopmail/domains/*****/*****/Maildir/
| /home/vpopmail/bin/to_only_forward.pl xxx@yyyy
&aaa@bbbb

------to_only_foward.plの内容------
#!/usr/bin/perl
#
#
($address) = @ARGV;
# mail header as a single paragraph
$/ = "";
$_ = <STDIN>;
chop; # remove the last character from the header
# Should be left with a single newline.
# replace To: header
if (/\nTo:\s/) {
if (/\nTo:(.*|\n)(.*|\n)$address/) {
exit 0 ;
} else {
exit 99 ;
}
} else {
exit 99 ;
}

と設定しているのですが…

ヘッダー情報のTo:がTo: xxx@yyyyならば正常に転送されるのですが、
To:とアドレスの間にBase64の内容だとかTo:ヘッダーじたいが2行に分かれている場合に転送されない。

どのようにすればTo:に自己アドレスが入っていた場合に転送するという設定にできますでしょうか?
正規表現箇所をどうにかする必要があると思いますが…自分ではこれ以上思いつかないので皆さんのお知恵をお借りしたく投稿させていただきました。

以上、よろしくお願いします。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2008-11-05 18:26
とりあえず、状況が整理できていないように見えます。
現状を丸投げされても、読んでる人には訳分からんです。
※整理できていれば、もう少し違う質問ができるはずです。

逆に言えば、整理さえできれば、自ら解決できる問題ではないですか?

極端な話、qmail 関係ないですよね。
「メール本文を STDIN から読み込み、To ヘッダに、指定のアドレスが含まれていれば 0 を、含まれていなければ 99 を終了コードとする Perl スクリプトが作りたい」
ってことですよね。
qmail の話はあくまで背景であって、全く別の代替案を引き出すために触れておいた方が良いかもしれませんが、今は本質ではないように見えます。

で、「正規表現箇所をどうにかする」と仰ってますが、では何故今の正規表現を考え出したのか。どういうパターンをどの程度の精度でカバーするつもりだったのか。
それが見えてきません。
※正規表現は思いつきで書くものではないので…

問題点としては、今の判断ロジックでは漏れがある、ということでしょうから、パターンを挙げてみることです。
その中に複数行パターンがあるようですが、正規表現一発での判断は諦めた方が良いかもしれません。ならば、地道に1行ずつに分解してループで判断処理を行うことになるでしょう。

[ メッセージ編集済み 編集者: angel 編集日時 2008-11-05 18:37 ]
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2008-11-06 17:17
Linuxもqmailもわかりませんが、メールヘッダの処理であれば少し書いたことが(とはいえwin32サービスですが)

Loopしながらチェックするわけですが、フラグを立てる方がいいでしょう。

(1)空行だったら(ヘッダの終了なので)breakする
(2)先頭が空白もしくはタブだったらフラグの状態を保持
(3)(2)以外で「to:(lowercaseで比較)」があったらフラグをON
(4)(2)(3)以外だったらOFF(To以外のヘッダと判断)。

フラグがONだったら渡された文字列を含んでいるかどうかをチェックします。

私が書いたときは、任意の文字列 + $address が存在すると困るので「" " + $address」もしくは「"<" + $address」を含んでいるかどうかでチェックした記憶があります。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2008-11-08 11:01
こんにちは。
実は、Perlスクリプトを作らなくても、ワンライナーのコマンドで、ある程度できるような気がします。

sed -e '/^$/q' | ( sed -e '/^[tT][oO]:/q;d'; sed --silent -e '/^[^ ]/q;p' ) | grep -Fliq メールアドレス || exit 99

勿論、正確ではないですが。
※hoge@example.comだけに限定しようとしても、xhoge@example.com や hoge@example.comx もひっかかってしまうため。

…でもこれだったら、perl -e でワンライナーにした方が簡単かも知れませんね。
もしくは sed の使い方がヘボなだけかも知れません。
※正規表現で ignore case する方法ってありませんかね。
1

スキルアップ/キャリアアップ(JOB@IT)