面倒臭いことはやりたくはないんだが、降りかかる火の粉は払わねばならない。
SPAMメールを何とかやっつけようという話です。
さくらインターネット(以降、さくら)のレンタルサーバー以外にもOCNとかSo-netとかにメールアドレスがあるんだけれど、それらの方はきちんと対策されているという感じで、SPAMで悩むようなことはほとんどないんだよね。もちろん、さくらに対する不満は一切ありません。メールアカウントを発行してもらっているわけじゃなくて、メールサーバーを借りているのだから、使い方次第だってこと。
さてさて自分で何とかするつもりだが、プロがサービスとして運用するわけじゃなく、素人が趣味でやるんだからレベルに差があっても当然。本気でブロックするのなら、ホワイトリスト以外は一切受信しないというところが究極なんだけど、ゲーム感覚も持ちながら、できるだけの対策を取ってみた。
まずはさくらのレンタルサーバー非公式FAQにてメールの仕組を確認する。これによると(実際は転載のようだが)さくらでは「maildrop」という配信プログラムを使っているとのこと。そのための設定ファイルは「.mailfilter」というもので、 MailBoxディレクトリ下のメールアカウント毎のディレクトリにこれを入れると良いのだと。
この非公式FAQのページ情報でおおよその設定方法が解る。そしてこの先に進もうと思うと俺のような素人にとっては意外と大変だった。正直言って試行錯誤でもあったことは否めない。構文的に、もしくはシステム的に正しいかの自信はあまりないけど、一応動いているようなので「.mailfilter」に書いてある表現を晒しておく。何かおかしいところに気付いた人は、陰で笑っちゃっててもいいんだけど、できれば訂正の指摘をして頂きたい。
まずはブラックリスト「.blockaddr」に列挙したメールアドレスからのメールを捨ててしまう設定。これはサーバーのデフォルトの設定を使うのと同じこと。ちなみに、各メールボックスで変えずに共通のブラックリストを使えばいいという考え方もあるけど、今回は分けておくことにした。
if ( /^From:\s*(.*)/ && lookup( $MATCH1, ".blockaddr" ) ) { exit }
せっかくだからFromアドレスよりもっと強力なものは無いかと考え、思い付いたのが中継サーバー。メールのヘッダーに書かれている「Recieved」の行に含まれる中継サーバーのドメインに応じて振り分けようということ。同じようなメールをアドレス詐称して送ってくるようなケースも叩き落とせる。これ用に「.blockdomein」というファイルを設置することが必要なのはもちろん、このブラックリストを書き間違えないように注意。また、メール送信元のローカル情報と言えるようなヘッダ部分もチェックしてしまうので、相当きっちりと絞り込めるようなドメイン名を指定しないと危ない。
foreach ( /^Received:\sfrom\s(.*)\s/:h ) { if ( lookup( $MATCH1, ".blockdomain" ) ) { to "maildir/.spam/" } }
そうこうしてみているうちに、楽天のアドレスやドメインを詐称して届くメールが多く、これらへの対策をとることにした。いやらしいのは、中継サーバーのドメインもrakuten.co.jpを詐称しているためブラックリストではじけないことだ。余談だが、楽天の広告メールは「clickmailer.jp」ドメインから発信されているものがあり、システム的に判断するとアドレス詐称になりかねないパターンであり、つまり法則に基づいた判別は無理かもしれないということもある。どこかに特徴は無いかと見てみると、SPAMの方は表示メールアドレスが「@rakuten.co.jp」で実メールアドレスは「@yahoo.co.jp」になっていることに気付いた。例えば、「From: foo@rakuten.co.jp <bar@yahoo.co.jp>」という記述になっている。面倒だけれどこれをチェックするように専用の対策を施そう。そもそも楽天からのメール自体も多数の広告SPAMぽいところではあるが、購入時の連絡とかが届かないのは困るしね。
if ( /^From:.*@rakuten\.co\.jp.* <.+@yahoo\.co\.jp>.*/:h ) { to "maildir/.spam/" }
あ、そうそう、こっちのメールアドレスはあまりチェックしないから、と言ってもこちらへメールを送ってくる母親のために、携帯に転送する仕掛けを作っておかなくちゃね。
if ( /^From:(.*)母親のメールアドレス(.*)/:h ) { cc "!息子@docomo\.ne\.jp" }
[amazonjs asin=”B000Y31EA8″ locale=”JP” title=”サイレンシア レギュラー”]