プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

さくらインターネットの高精度迷惑メールフィルタが学習しないときの対応策

迷惑メールの振り分けに、さくらインターネットの高精度迷惑メールフィルタを使ってます。性能的には悪くない印象なのですが、特定のメールをいつも迷惑メールとして判定してしまいます。

で、これが困ったことに何度学習させてもなかなか改善してくれません。

困ったなと思って、ググってみると、やはり同じような悩みを持つ人がいるようで、下記の記事を見つけました。

さくらのレンタルサーバの「高精度迷惑メールフィルタ」と「簡易迷惑メールフィルタ」を併用した話|garmy

なるほど。

ということで、こちらの記事を参考にして、自分なりの対策方法を取ってみたので、メモっておきます。

方針

上記の記事の方は、いくつかのメルマガを高精度迷惑メールフィルタではなく、簡易迷惑メールフィルタにかける、というやり方をしてました。 これを実現する方法が、 .mailfilter の編集です。なるほど。 .mailfilter を編集すれば、こんなこともできるんですね。

ということで、自分のケースの場合、どういう方法がいいかを考えてみます。

求めるもの

現時点で困っていることとして、大きく2つあります。

  • 特定のサイトからの通知メールが、迷惑メールとして判定される
  • あるメーリングリスト(Google グループ)からのメールが、迷惑メールとして判定される

迷惑メールと判定されたものは、毎回『迷惑メールではない』として学習させていますが、一向に改善される気配がありません。具体的に何件学習させたとか、覚えていないのでなんとも言えませんが、なかなか先が見えない作業なので、ちょっと嫌になってきます。

このことについて、一度さくらインターネットのサポートさんに聞いたところ

  • 改善しない場合は、高精度迷惑メールフィルタの利用をやめる
  • 許可リストにメールアドレスを追加する

で対応してください、とのことでした。許可リストね。そういうやそんな存在ありましたね。

受信許可/拒否するメールアドレスを設定したい | さくらのサポート情報

これって、さくらインターネットの Web メールから設定するやつですね。『よくある質問』のこのページをみると、

となっており、許可リストのほうが、高精度迷惑メールフィルタより優先されるということのようです。今回の用途の場合は、これの利用でなんとかなりそうですね。

挙動の確認

一応、実際の動きを確認するため .mailfilter の記述も見てみます。高精度迷惑メールフィルタを設定したときの .mailfilter (実際のものはこの後ろに自分で定義した設定がいろいろと書いてあります)を見ると

if ( /^X-VADE-SPAMSTATE:/ )
{
        if ( ! /^X-VADE-SPAMSTATE:\s*clean/ )
        {
                if ( ! ( /^From:\s*(.*)/ && lookup( $MATCH1, ".whitelist" ) ) )
                {
                        to "maildir/.spam/"
                }
        }
}

これを見ると、先に高精度迷惑メールフィルタが動いて、ヘッダに判定結果を追加しているようです。そのうえで、判定結果(X-VADE-SPAMSTATE)が clean 以外のメールについて、メールの From ヘッダが .whitelist ファイルに書かれた内容(のどれか)と一致すると迷惑メールではないと判定する( .whitelist に一致しなければ迷惑メールとする)、という動作のようですね。

念のため、迷惑メールに振り分けられたメールのヘッダを確認すると、あれ?2つ目のパターンの場合は、 From はメーリングリストに投稿した個人のメアドになっていて、メーリングリストのアドレスは Sender ヘッダに設定されています。

ということで、これを考慮した .mailfilter に直します。

修正した .mailfilter

上記を踏まえて、今回はこのような .mailfilter としました。

if ( /^X-VADE-SPAMSTATE:/ )
{
        if ( ! /^X-VADE-SPAMSTATE:\s*clean/ )
        {
                if ( ! ( /^From:\s*(.*)/ && lookup( $MATCH1, ".whitelist" ) ) && \
                     ! ( /^Sender:\s*(.*)/ && lookup( $MATCH1, ".whitelist" ) ) )
                {
                        to "maildir/.spam/"
                }
        }
}

.whitelist に含まれているメアドをチェックする際に、 From だけでなく Sender も見るようにしたものです。なお、 .whitelist の内容は、さくらインターネットの Web メールを使うと以前に起きた書き換え問題がまたおきそうなので、 SSH でログインして直接編集しています。

実際に、これを設定して動かしてみると、うん、両方とも問題なく迷惑メールではないとして判定されてますね。

まとめ

参考にした記事とは異なり、今回は簡易迷惑メールフィルタは使わずに、許可リストでの対応としました。しばらくこれで使ってみて、迷惑メールがすり抜けるようになってきたら、管理迷惑メールフィルタとの併用も考えようと思います。

あと、上で、学習させても反映されないという話を書きましたが、これについてもさくらインターネットのサポートさんに聞いたら、

高精度迷惑メールフィルタ全体で学習していて個別のユーザーごとに学習してはいない

という旨の回答をもらいました。それなら、なかなか学習しないのも納得です。このあたりは学習データでパーソナライズするような機能をつけて欲しいものですね。