はじめに
ベイジアン・フィルタを内蔵したMUA「tunbridge」を公開しました。
以前はPOPfileとBecky!の組み合わせでメールを使っていました。POPfileはもう完全に開発も止まっていますし脆弱性もあるらしいので流石に今からセットアップするのは躊躇われました。いろいろあってAntigravityに課金してしまったのでこの際作ってしまえということで作ったのがこれです。
(暇ができたら加筆します。)
ここから加筆分
昔話になりますが、メールアカウントはインターネットプロバイダのアカウントに付随するもので、プロバイダが用意するメールサーバに接続して使うものでした。いわゆる「普通」のメールサーバ(MTA、かな)で、SPAMフィルタとかそういう概念はただのサーバにはなかったのです。
今でもプロバイダが提供するメールアカウントはありますが、その意味は大きく違っています。大手IT企業がインターネットユーザにオープンにメールサービスを提供するというのが普通になり、そのようなメールサービスにはSPAMフィルタ機能が備わるようになりました。
SPAMは昔からあり、無駄にメールサーバの容量を喰う迷惑な代物でした。世の中から収集したメールアドレスに無差別に広告メールを送り付けるもので、電子的な「ダイレクトメール」というのがSPAMの起源だったわけです。
その後単なるSPAMだけではなくフィッシングやリンクを踏むことでウィルスに感染させるもの、あるいは踏み台にして侵入しバックドアを仕掛けるもの、などなど、日々届くメールの中に様々なリスクが潜むようになりました。SPAMなどの「欲しくない」メールを正しく検出して除外することが強く求められるという状況になってきたわけです。
なぜ今ある迷惑メールフィルタは使えないのか
このように重要な機能である「迷惑メールフィルタリング」の機能ですが、提供されていても、満足のいくものであるとは限りません。
よくある不満としては
- 普通のメールが勝手に迷惑メールに分類されてしまう
- 迷惑メールに分類されたものを「迷惑メールではない」と教えてもうまく学習せず繰り返し「迷惑メール」と誤認定する
- 明らかな迷惑メールなのに迷惑メールに分類されない
- 迷惑メールであると教えても繰り返し「迷惑メールではない」と誤認定する
のような感じだと思います。
なぜ毎日迷惑メールに関する誤判定を訂正しているのに精度が上がらないのか、それはこういうメールサービスの迷惑メール判定が「みんなの結果」を使って学習しているからなのです。
たとえばはるか昔に一回だけ買い物をしたことがある通販サイトからメールマガジンが届くようになったとしましょう。今はそこの製品をそこから買う必要もなく多分二度と使わない。ただメールマガジンの配信を停めるのにも手間がかかります。ついつい「このメールいらないから迷惑メールでいいか」と放置してしまうことがあるかも知れません。このような事例が多数重なると、本当にそのサイトを贔屓にしているユーザがこのメールは迷惑メールではないと申告してもなかなか判定が覆りません。
迷惑メールの判定基準が「みんな」になっているからこうなってしまうのだと説明されています。
じゃあ、何故あまり上手く行ってない(先刻承知、らしい)のにそうは言わず、現状の機能を(もちろん絶え間なく改良はしているのでしょうけど)提供し続けているのかというと、それが全員をプロテクトするために必要だからという理由と、個人個人に特化したフィルタリングを提供するとリソースが膨大になってコストが合わないという理由と両方あるようです。
こういう調子なので諦めるしかなさそうだな…というのを察してしまったわけなのですね。
みんなが迷惑だと感じるメールでも自分には迷惑ではない
繰り返しになりますが、「みんな」の迷惑メールと「私」の迷惑メールは違います。確定で「有害」なものだけを仕分ける仕組だとしてそれを全員が理解して使えば違うのだろうとも思うわけですが、残念ながらそうなっていません。
なので、POPFileのように「自分に届いたメール」だけから分類を決めるようになっていれば、自分にとって迷惑なメールを迷惑なメールと判定することができ、それが他の人に悪影響を及ぼすこともありません。迷惑ではないメールはしっかりと迷惑ではないメールと判定されます。それが一つの理想ではあるのです。
仕組みのお話
POPFileが実現していたベイジアンフィルタの仕組みは、「バケツ」を用意して、メールをどのバケツに放り込むかを決めてやることで、そのバケツに入ったメールに使われた単語のそのバケツに分類される確率が決まっていくというものです。この確率を用いて、新たに届いたメールに含まれる単語がどのバケツに一番強く結びついているかを総合的に計算してそのメールをどのバケツに入れるかを決定しています。
充分学習されていなかった単語が混じっていたために間違ったバケツに入ったメールは、あとから人間が正しいバケツに入れなおしてやることで、単語に対する確率が再計算されます。このようにして蓄積されていったデータによりどんどん分類精度が上がっていくわけです。
この仕組みは単に迷惑メールとそうでないものを分けるために使われるだけではありません。通常メールと、買い物したときの連絡メール、荷物が届いた通知、普段のメールマガジン、金融機関からの連絡、ログイン通知のようなセキュリティ関係、みたいにバケツを増やせばそれぞれについて確率を計算するようになるので、正しく自動的に分類されていくようになっていきます。
一般的に、迷惑メール以外のメールについては、フォルダを作成したら、ドメイン名や特定の単語の出現などのフィルタ条件を決めて届いたメールをフォルダに移動してやる自動振り分け、みたいな実装が多いですが、こちらの方式ではそれは必要なく、個人に届いたメールについて、本人がバケツを選ぶことで決まっていく分類基準に基づいて分類されるので個人の認識に合致する分類結果が得られるというわけなのです。
POPFileよありがとう、さようなら
昔あったPOPFileはPerlで書かれたアプリケーションで、この仕組みを実装したソフトウェアでした。Windowsでもインストールして常駐させておけばいろいろなメールアプリから利用することができて迷惑メール分類ソフトとして非常に優秀でした。
しかし使うまでのハードルが高いという問題点もありました。
POPプロトコルやIMAPプロトコルを中継するproxyのような機能を果たすものであったため、メールアプリのサーバ設定などをPOPFileを使うように特殊な設定値に書き換えてあげる必要がありました。そのため、メールサービスの利用法についてある程度の知識が必要なものだったわけです。例えば「メールアプリの設定の仕方」みたいなページをメールサービスの提供元が公開していたとしてもそのままでは使えなかったりするわけですね。
あと、単純に、POPFileは相当古いソフトウェアなので(現在のPerl処理系でも動いているというのはすごいことですが)、開発はかなり昔に止まってしまっていますし、放置されたままの脆弱性もあるとのことです。なので、今から利用するのはさすがにおススメできません。
個人的にももういろいろ設定するのは面倒なのでやりたくありませんでした。で、考えたのは、POPFileが備えていたような機能を最初から内蔵したメールクライアント(MUA)を作ってしまえばいい、という話でした。それがこのアプリケーションを作るきっかけだったわけです。
使い方
リポジトリからクローンしてビルドすると、普通にメールアプリtunbridgeができあがります。これを起動するだけです。
初期状態で「勝手に生成されたそれっぽいメール群」が受信された状態になっており、すでにバケツに分類された状態になっています。つまりそういう「でっち上げられたメール」を使ってある程度の学習が済んでいる状態になっています。
これらのメールは学習に使われただけで残しておく必要はないので消して構いません。
メールアカウントに合わせてサーバやアカウント・パスワードなどを設定していくと普通にメールを送受信できるようになります。
受信したメールは、初期状態でも、すでにある学習結果に基づいてバケツに入った状態になりますので、最初のうちは正しいバケツに入っているか確認し、違っていたら正しいバケツに入れなおしてあげてください。
初期状態では存在しないバケツを増やすことも可能です。その場合もそのバケツに入るべきメールを手動で放り込んでやれば、学習事例が増えていけばそのバケツに入るべきメールは自動的に識別して放り込んでくれるようになります。正しく分類できるようになるまでは手動でバケツを指定してあげる必要がありますが、それほど長い間手動分類してやる必要はなく、すぐに正しく自動判定されるようになります。
今までの迷惑メールフィルタに満足できていない人は試してみていただきたいと思っています。