Eximでspamブロック

D:20020826 免責事項

あっちこっちからやってくるspamを除去するのにISPのサービスを使っている。しかし、これだけではまだ足りない。とくに大陸方面からやってくるspamを何とかしようという試み。完全ではないけれど、ほぼいい感じになってきたのは、woody標準のMTAであるEximのおかげだ。

spam除去の仕組みは、spamメールを選別するフィルターファイルをホームディレクトリに設置することで実現している。詳しくはExim付属のドキュメントを参照のこと。[5]

spamの特徴を調べる

今回はとくに大陸方面のCとかKの言語で送られてくるメールを対象とする。これらの言語の特徴がメールヘッダーのなかにあるのは容易に予想がつく。実際、spamメールのヘッダーの「Content-Type:」フィールドのなかに「GB2312」や「ISO-2022-KR」といった文字列が共通して見られる。このような特徴を拾い出して列挙したのがこの一覧。これをもとにフィルタのルールを記述していく。

GB2312
ISO-2022-KR
ks_c_5601-1987
euc-kr

ルールを記述してファイルを設置する

Exim付属のドキュメントの例を参考にして、除去すべきメールを選別するルールを記述したフィルタファイルはつぎのとおり。

# Exim filter  <<== do not edit or remove this line

if $header_Content-Type: contains "text/html" or
   $header_Content-Type: contains "GB2312" or
   $header_Content-Type: contains "ISO-2022-KR" or
   $header_Content-Type: contains "ks_c_5601-1987" or
   $header_Content-Type: contains "euc-kr" 
then
   save $home/spam
#   seen finish
endif

if $header_Subject: contains "euc-kr" or
   $header_From: contains "euc-kr" or
   $header_Subject: contains "ISO-2022-KR" or
   $header_From: contains "ISO-2022-KR" or
   $header_Subject: contains "ks_c_5601-1987" or
   $header_From: contains "ks_c_5601-1987" or
   $header_Subject: contains "GB2312" or
   $header_From: contains "GB2312" 
then
   save $home/spam
#   seen finish
endif
      

このフィルターファイルを.forwardという名前でホームディレクトリに設置します。

検証してみる

フィルターファイル(.forward)を設置したら、検証の前に適切な場所($home/mail/fooなど)に適切な名前(spamでなくても良い)で空の一時ファイル(regular file、644)を作成しておきます。前節のフィルタファイルの例でいえば、ホームディレクトリへ移動した後につぎのようにして一時ファイルを用意します。

~$ touch spam

if-endifブロック内にある

save $home/spam

は、このブロックがまだ検証中のため予想外のメールが除去されないようにするためのものです。このif-endifブロックの条件に合致したメールだけがspamという名前のファイルへsave(追記)されていき、mailboxには転送されません。spamの内容を調べて予定どおりの動作をしているかを検証します。失われたメールは元に戻りません。くれぐれも十分な検証期間を設けて大切なメールを除去しないよう注意してください。

実運用に移行する

検証の結果、spamメールを選別するフィルタが予定どおりの動作をしていれば、if-endifブロックの

save $home/spam

seen finish

と変えて実際の運用を始めます。



[5] 参考文書:/usr/share/doc/exim/filter.txt.gz