前回のDay3では、Tkinterを使ってGUIを導入し、
など、“ただの接続テスト”から一歩進んだところまで実装できた。
そして今回のDay4。
いよいよ、
“本文解析”
に手を出し始める。
今回やりたいのは、単純にメールを表示するだけではない。
本文の中から、
- 【重要】
- 本人確認
- お支払いを完了してください
- 利用制限
- アカウント停止
など、詐欺メールでよく見る文言を検出し、
「どれくらい怪しいメールなのか」
をスコア化してみよう、という話だ。
つまり今回から、このツールは少しずつ、
“Yahooメールを読むだけの簡易メーラー”
から、
“迷惑メール解析ツール”
へ進化し始める。
さらに今回は、Day1からずっと問題視していた、
みたいな“フィルタ回避表現”にも対策を入れてみた。
スペースや全角文字を除去し、正規化してから解析することで、
として認識できるようにしている。
地味な処理だが、こういう部分が迷惑メール対策ではかなり重要になりそうだ。
本文解析を実装してみる
Day4で追加したのは、本文を取得した後に、その内容を解析する機能だ。
これまでは、選択したメールの本文を表示するだけだった。
つまり、
「読めるようになった」
という段階である。
今回はそこから一歩進めて、
「怪しい文言が含まれているか」
をチェックするようにした。
判定対象にしたのは、件名、送信者、本文。
この3つをまとめて解析し、危険そうな単語が含まれていたらスコアを加算する。
例えば、
この辺りは、詐欺メールでかなりよく見る文言だ。
もちろん、本物のメールでも使われる可能性はある。
ただ、私の場合はYahooメールで決済系サービスを使っていない。
つまり、Yahooメール宛にこの手の支払い要求や本人確認メールが来た時点で、かなり怪しい。
なので今回は、自分の運用に合わせてかなり強めに判定している。
汎用ツールとしては危険かもしれないが、まずは自分用ツールとして育てる段階なので、これでいいと思っている。
危険ワードをスコア化する
本文解析では、怪しい単語を見つけるだけではなく、スコアとして加算する形にした。
例えば、
だけなら、まだ少し怪しい程度。
しかし、
のように、複数の危険ワードが重なってくると一気に怪しくなる。
そこで今回は、検出した単語ごとに点数を加算し、合計スコアで危険度を表示するようにした。
判定はざっくり、
のような段階にしている。
これにより、単純に「怪しい」「怪しくない」ではなく、
「どのくらい怪しいか」
を見られるようになった。
さらに、GUI上には検出された項目も表示する。
例えば、
というように、なぜスコアが上がったのか分かるようにした。
この“理由が見える”というのはかなり大事だと思う。
AIに丸投げすると、判定理由がふわっとしがちだ。
一方で、ルールベースなら、
「この単語に反応したから危険判定になった」
というのが分かりやすい。
迷惑メール対策では、こういう透明性のある判定の方が扱いやすい気がする。
GUIに解析結果を表示する
スコア判定を入れたことで、GUI側にも「解析結果」欄を追加した。
ここには、
- 迷惑度スコア
- 判定結果
- 検出された項目
- 正規化後テキストの一部
を表示するようにしている。
これが思った以上に便利だった。
本文を見て、
「なんとなく怪しい」
で終わるのではなく、
のように、理由付きで確認できる。
これなら、後からルールを調整する時にも分かりやすい。
例えば、
「iCloud系が注意止まりになっている」
と分かれば、iCloud関連ワードの点数を上げればいい。
逆に、
「これは本物っぽいのにスコアが高すぎる」
となれば、そのワードの扱いを見直せる。
つまり、GUI上に解析結果を表示することで、ツール自体を育てやすくなった。
この辺りから、ただのメールビューアではなく、
“迷惑メール判定ツール”
として動き始めた感じがある。
iCloud系メールで“個人環境特化型”の強みが見えてきた
実際に解析を試していて面白かったのが、iCloud系メールの扱いだ。
最初は、iCloudを名乗るメールが「注意」判定止まりになっていた。
ただ、よく考えてみると、私はYahooメールでiCloud関連サービスを使っていない。
つまり、
「Yahooメール宛にiCloudの重要通知が来る」
という時点で、かなり怪しい。
なので今回は、iCloud関連ワードのスコアを強めに調整した。
こういう調整ができるのは、自分専用ツールならではだと思う。
Gmailのような巨大サービスは、万人向けに判定しなければいけない。
だから、
「iCloudメール=危険」
みたいな極端な判定はできない。
でも、自分専用なら話は別だ。
- 楽天カードを使っていない
- YahooメールでAmazon登録していない
- iCloudを使っていない
こういう“個人環境”を前提にルールを組める。
これは、汎用フィルタには無い強みかもしれない。
逆に言えば、外部公開版を作る場合は、この辺りをユーザーごとに設定できるようにしないと危険そうだ。
例えば、
- 使用中サービス
- 未使用サービス
- 強制危険判定ワード
などをGUIから登録できるようにした方が良さそうである。
固定ルールだけでは限界も見えてきた
ただ、今回の解析機能を作っていて、固定ルール方式の限界も少し見えてきた。
今は、
のように、コードへ直接キーワードを書いている。
これは最初の実験としてはかなり楽だ。
ただ、新しい迷惑メールが来るたびに、
「このワードも追加したい」
となる。
そのたびにコードを書き換えるのは、さすがに面倒だ。
例えば今回も、
「iCloud系メールをもっと強く判定したい」
という話になった。
今は手作業でキーワードを追加しているが、将来的にはGUIから登録できるようにした方が絶対楽だと思う。
例えば、
を分けて登録できるようにする。
そして、それをJSONへ保存して、次回起動時に自動読み込みする。
これができれば、
“使いながら育てる迷惑メールフィルタ”
みたいな方向へ進めそうだ。
特に迷惑メールは、一度来た系統が何度も来ることが多い。
つまり、一度登録したルールは後からかなり効いてくる。
導入時は多少面倒でも、長期的にはかなり楽になるはずだ。
Day4時点の感想
Day4まで進めてみて、かなり“迷惑メール解析ツール”らしくなってきた。
最初は、
「PythonでYahooメールを受信できるか」
というだけの実験だった。
そこからGUIを作り、本文を表示し、今回はついに本文解析とスコア判定まで進んだ。
まだ削除も移動もしていないが、今の段階ではそれでいい。
むしろ、いきなり削除機能を入れず、
という順番で進めているのは、かなり安全だと思う。
今回の段階で、
といった文言を拾えるようになった。
これだけでも、Yahooメールに届く典型的な詐欺メールにはかなり対抗できそうだ。
ただ、固定ルール方式のままだと、今後の調整が面倒になるのも見えてきた。
なので次回は、GUIから危険ワードを手動登録できるようにしたい。
差出人、件名、本文。
それぞれに対して危険ワードを登録し、JSONへ保存する。
ここまでできれば、このツールはさらに“自分専用の迷惑メールフィルタ”へ近づくはずだ。
詐欺メールとの戦いは、まだ続く。