maildropの.mailfilterでReceivedフィールドの判定をする

.mailfilterのforeachの使用例があんまり見つからなかったのでメモ。

maildrop環境の.mailfilterで

if ( /^From:.*SPAMMER/ )
{
        to "maildir/.Trash/"
}

みたいな感じでSPAM処理をしていた場合、同じようにReceivedフィールドも判定しようとした時に

if ( /^Received:.*SPAMSERVER/ )
{
        to "maildir/.Trash/"
}

と書いてしまうと、複数あるReceivedヘッダの内最初の1行しか判定されない。判定したいのは大抵最後の行なので役に立たない。

その場合、foreachで各行に対して判定を行う。リストをlookupさせる形にして、

SPAMSERVER
spamserver\.com
\[127\.1\.2\.3
foreach ( /^Received:.*/ )
{
        if ( lookup( $MATCH, ".receivedblocklist" ) )
        {
                to "maildir/.Trash/"
        }
}

みたいな感じにするのが良さそう。

ちなみに、foreachの中では正規表現のサブパターン1が使えないので、$MATCHに格納された行全体に対して行う必要がある点に注意。
※初めサブパターンで条件作ったところ判定されず、ターミナルでmaildrop動かした出力を見たら$MATCH1とかに値入ってなかったのでようやく挙動理解した……。

  1. 正規表現の中で()で囲んだパターンを$MATCH1,$MATCH2,…で参照するやつ ↩︎

コメント