header

注:このページは書きかけ&未推敲ですが、しばらく手を加える予定もないので一旦リリースしたものです。

さくらインターネットのメール・ボックスで、ロシア語件名のメールを弾く

さくらインターネットのサービス「さくらのレンタル・サーバ」を使用しています。こちらのメール・ボックス宛てに届くロシア語件名のスパムが 増加傾向にあったので対策を探してみたところ、見つかったサイトの多くは『日本語以外』のメールを排除する方法の紹介に留まっていました。 (日常的に英文メールを交換している身では考えられない…)

今回みつけた対策と併せ、maildropのさわりを自分宛ての覚書も兼ねて紹介します。

maildropについて

.mailfilterファイルのテスト

まず前提条件として、テストしたいメールを含むファイルを用意します。Thunderbirdの場合、メールを開いた状態で
「ファイル」→「名前を付けて保存」→「ファイル」
を選択することでファイルとして保存できます。
ここでは保存したファイル名を"spam.eml"として、.mailfilterファイルと同一ディレクトリにアップロードしました。
このテストの段階では、.mailfilterファイルは所定の場所に保存する必要はなく、テスト用に作成したディレクトリでも構いません。
.mailfilterファイルに不備がある場合はメールの受信が停止しかねませんので、むしろ異なる場所で.mailfilterの正当性を確認した後、 所定の場所へ移動させた方がよいかも知れません。

次に、SSHでサーバにログインして、以下のコマンドを入力することで.mailfilterファイルが正しく記載されているかテストすることができます。

# cat spam.eml | maildrop -V 9 -m .mailfilter

入力されたファイルはmaildropにより行毎に解析され、テストの結果が表示されます。
.mailfilterファイルのパーミッション設定が正しくない場合、その旨だけが表示されテストは中断されます。

(Bad permission setting goes here)

ロシア語件名を弾く.mailfilter設定

今回対策をするのは、以下のような行をヘッダ内にもつメールです。

Subject: [LOW SPAM]=?koi8-r?B?8NLPxsXT08nPzsHM2M7PxSDPwtPM1dbJ18HOycUgz9Qg+uXv7un0?=

件名中の"=?koi8-r?B?"は、それに続く暗号のような文字列をロシア語の文字コードとして認識するようにとの指示でして、 実際に筆者のメーラー(Thunderbird)では不可解な英数字の羅列ではなく、ロシア語として表示されます。

裏を返せば、"koi8-r"という文字列が件名中に見つかれば、少なくとも件名にはロシア語が含まれていると考えてよさそうです。
今回は 、この文字列が件名中に見つかったメールを排除する設定を.mailfilterに記載します。
さくらインターネットの場合、フィルタリングの内容は、以下のファイルに記載します。

/home/$ID/MailBox/$User/.mailfilter

$IDはユーザID、$Userはフィルターを適用したいメール・アドレスのユーザ名に、それぞれ読み替えて下さい。
ファイルが存在しない場合はtouchコマンド等で作成し、パーミッションを600に変更して下さい。

ファイル内部に、以下のように記述します。

if (/^Subject:.+koi8-r/)
{
    exit
}

if()内の表記は、要約すると以下の条件を満たす行を探すための指示です。

「"Subject:" で始まり、koi8-rを含む行」

この条件を指定するのに、「正規表現」という表記法を使用します。
正規表現においては、一部の文字や記号が特殊な意味を与えられており、これらを組み合わせて特定のパターンに該当する文字列が存在するかどうかを検査します。

正規表現の解説は他所に譲るとして、なにを行っているかだけ大雑把に説明します。
maildropの場合、このチェックは行毎に行われます。また、以下に現れる「マッチする」とは、チェックした行が指定した条件に当てはまることを意味します。

/  / この二つの記号で囲まれた範囲が正規表現(特定のパターンを指示するための表記)であることを宣言します。
^ 次の文章が行頭から始まることを宣言します。この場合、"Subject:~"が行頭にある場合のみマッチします。
このため、行頭以外の文中に"Subject: hoge koi8-r hoge"というパターンが出現してもマッチしません。
.+ .(ピリオド)は任意の文字を、+は前述の文字が一つ以上存在することを表します。
つまり、単一行内であれば"Subject:"と"koi8-r"の間に、異なる文字がいくつ挟まれようとマッチします。

メールのヘッダ、本文を含むすべての行をチェックして、一つでも当てはまる行があった場合は括弧内のコマンドexitが実行されます。
逆に条件に該当する行が一つもなかった場合は何も行われず、標準的な動作…つまり受信メールのメール・ボックスへの保存が実行されます。