procmailでスパム確定などの理由で特定のメールアドレスを除外したい場合、こういう感じでprocmailrcに記述していると思う。
:0 * ^From: hogehoge\@example.com $SPAM
これで、hogehoge@example.com のメールはスパムフォルダへ行ってしまう。
大体の場合はこれで問題は起こらない。 では、特定のドメイン名のメールアドレスを全部除外したい場合はどうしたらいいだろうか?
:0 * ^From: .*\@.example.com $SPAM
これも大抵の場合は問題は起こらないが、世の中には .com.au といったドメイン名も存在するので、もし example.com.au からメールが届く可能性がある場合はよく考えた方が良さそうだ。 まあ、example.com.au から大事なメールは絶対に届かないからいいや、という人も多いだろう。大抵の人はそうだろう。 では、example.co の場合はどうだろうか?
:0 * ^From: .*\@.example.co $SPAM
何も考えずにこうしてしまうと大抵の人はたちまち困ってしまうだろう。なぜならこのやり方の場合は example.com にもマッチしてしまうからだ。つまり、もし”example”が”google”だったり”asahi”っだりするとどういう事になるか分かるだろう。 .coドメイン(コロンビアのドメイン名)のメールなんて関係ないと思っていたら大間違い。 最近、スパムとして届くメールの From: にこの.coドメインのメールアドレスが使われていることが増えてきている。 恐らく.com ドメインと見た目が似ているので都合がいいのだろう。現にたった今、procmail の設定でヤバイことになりかけてるし。 他にも我らが日本のドメイン名の中には .co.jp というドメイン名も存在するし、他の国でも .co.uk なんかは結構メジャーだったりする。もちろん上記の .com.au にもマッチする。さらに、 hogera@example.comic.example.net なんてサブドメインなメールアドレスにもマッチするので事態は深刻だ。
では、どうすればいいだろうか?まずここで思いつくのは .co がメールアドレスの末尾にあるという点に注目すれば何とかなりそうだということだろう。で、こんな風に書いてみることになる。
:0 * ^From: .*\@.example.co$ $SPAM
そして .co ドメイン名のメールが届くのを待つ。そう、動作チェックが結構面倒なんだよね、こういう条件の場合は。 そして待った結果大抵の場合、.co ドメイン名のメールはこれをすり抜けてInboxに鎮座しているのを発見することになる。 何故そういうことになるかと言うとFrom:ヘッダのメールアドレスの末尾には多くの場合”>”があるからだ。
それでは
:0 * ^From: .*\@.example.co>$ $SPAM
と書けば大丈夫かというと、そうではない。末尾が .co の状態のメールが届く可能性もやっぱりある。さっき自分が最初にそう思ったばかりでしょ?
なので、
:0 * ^From: .*\@.example.co>$|\ ^From: .*\@.example.co$ $SPAM
と、泥縄式に両方を書けば、やっと望みの結果が得られることになる。 最終的には2行(泥縄)になっているのを1行に整理すると、
:0 * ^From: .*\@.example.co(>|)$ $SPAM
こんな感じでやっと希望する動作になる。
コロンビアには友達や知り合いもいないし、いてもメールアドレスはgoogleだったりするので全ての.coドメイン名のメールアドレスでまとめて除外しても全然問題ない場合は、
:0 * ^From: .*\@.*\.co(>|)$ $SPAM
これで完了。
正規表現に慣れている人ならどうってことはないんだろうけど、procmail の設定例を色々見ても大抵は特定のメールアドレスでの設定はよく見つかってもドメイン名毎にどうにかするという設定例って少ないというかほとんど見かけ無いんだよね。
特定のTLD(Top Level Domain name)全体を拒否という設定は大胆過ぎるというのもあるんだろうけど、近年色んな新しいTLDがわんさか出てきていてその殆どがスパムだったりするのでスパムをばっさり切るには結構いい方法だと思う。(どっとおんらいんとかどっとうぇぶさいととかどっとてっくとか)
という事で、決してコロンビアという国ををディスる意図はないんですが、 .co ドメイン名のメールを全部除外したい場合はこうやればOKというお話でした。