2005-06-29 [長年日記]

[Q3] スパムフィルタと振り分けルール

受信時に振り分けを実行することができるようになったので、スパムフィルタを使用してスパムかどうか判定する@Junk()というマクロの関数を用意して、

<rule match="@Junk()">
 <move folder="Junk"/>
</rule>

をスパムフィルタだと考えると、スパムフィルタと振り分けルールを一体化できそうな気がします。そうすると、ホワイトリストが欲しいとか、手動でスパムフィルタをかけたいという要望も一挙に解決できそうな気がします。

問題は、今までチェックボックス一個でスパムフィルタをかけることができたのに、設定が面倒になるということでしょうか。

本日のツッコミ(全11件) [ツッコミを入れる]
# H.Aoyama (2005-06-29 17:19)

問題は..という書き出しがあるので喜んじゃっていいのかわからないんですが,私個人的にはこれが実現されるとむちゃくちゃ嬉しいです\(^O^)/.

因みに,この場合って全て rules.xml に書く事になると思うんですが,適用順って「上から順に」でよかったんでしたっけ?

その場合,

・普通の振り分けルールによる振り分けルール判別
・予めわかっているアドレスは振り分け対象外(ホワイトリスト)
・それ以外について,スパムルールによるフィルタリング

とやりたい場合,これらを上から順に書けば良いということでいいんでしたっけ.

また,「ホワイトリスト」をどう記述するか,という問題かもしれませんけど,「未読は対象外」と同じイメージで「ホワイトリストは対象外」とやるのかなと想像したんですが,これだと振り分け対象からも外れちゃいそうなので,どうやって書くのだろう? という部分も自分的には気になる点だったりします.

まだ実現するかどうか決まってないかも知れませんが,実現を強く希望するという意思表明として,書かせて頂きました. よろしくお願いします.(他の人から反対が出ない事を祈りつつ..)

# snak (2005-06-29 17:45)

振り分けルールの適用は上から順番です。

ホワイトリストの処理を今のやり方でやろうとするとこんな感じでしょうか。もはやほとんどの人には書けない気もしますけど…

white.macroというファイルで@Whiteという関数を定義します。
--- white.macro ---
@Defun('White',
@Contain(From, '@example.com'),
@Contain(From, '@example.org'))
---

で、それを使います。

<!--
ホワイトリストに含まれていなかったら
スパムフィルタの処理をしてスパムだったら
Junkフォルダへ移動
-->
<rule match="@Progn(@Include('white.macro'),
@And(@Not(@White()), @Junk()))">
<move folder="Junk"/>
</rule>
<!-- これ以降は普通のルール -->

もちろん@Whiteでやっている事をruleのmatch属性に書いちゃっても良いのですが、別けた方がメンテナンスしやすそうなので。

# H.Aoyama (2005-06-29 18:24)

あ,そっか. そうですよね. @Junk() と @And を取ればいいですね.

で,私もなんとなく @Include 使うのかな,とは思っていたんですが,@Defun で関数定義するまでは思いつきませんでした. 単純に,

@If(
@Contain(From,'@domain.com'),@True(),
@Contain(From,'@dom.jp'), @True(),
・・・・
@False()
)

みたいなテキストを作っておいて,@Include() すりゃいいかな,とか思ってました. これだとダメでしょうかね? うまく行くとしても,大差無いとは思いますけども. 一応思いつきを確認したかっただけってことで.

# snak (2005-06-29 18:30)

それでもOKです。そっちの方がすっきりしていますね。
いずれにしても結構難しそうなので、@Junkの引数としてうまい具合にホワイトリストを渡せるようにしておくとちょっと幸せになれるかもしれませんね。

# H.Aoyama (2005-06-29 18:57)

そうですね. イメージとしてはこんな感じではどうでしょうか?

-- white.list --
<!-- コイツには,Whitelist として登録したいドメイン名をずらずら記述する -->
@domain.com
@dom.jp
・・・
----

で,ルール時に指定があれば @Junk() で外してもらえると.

<rule match="@Junk('White.list')))">
<move folder="Junk"/>
</rule>

...あるいは,ホワイトリストのテキスト名/存在ディレクトリは固定にしてしまって,

@Junk(@True()) ならホワイトリストチェックあり,@Junk(@False()) ならチェックなし(デフォルト @False()) でもいいかもしれませんね.

アカウント毎にホワイトリストを分けたい人もいるかも知れないから,私的には前者かなぁ..とか思ったりしますがどうでしょうか.

# snak (2005-06-29 19:40)

ホワイトリストとしてドメイン名しか使わないのであればそれくらい簡単で良いと思うのですが、実際のところはどうなんでしょう?

マクロでやれば複雑な事はできるのである程度のところで落とし所を見つけられれば良いと思うのですが、自分でホワイトリストを使ったことがないのでどういう指定が普通に良く使われるのかが良くわからないのです。

# H.Aoyama (2005-06-30 11:36)

まず個人的な話でいっちゃうと,少なくても現状の奴は,From のドメイン名のみでやってます(SpamAssassinで). なので,これが基本なのかなぁと思ってます.
それに,@And() を取るというアイディアが既にあるので,これ以上やりたい人は,それこそマクロでゴニョゴニョすれば出来ると考えました. これなら何でもアリですしね.
なので,簡単にやる部分は簡単に実装できた方が幸せかな?と思った次第です.

如何でしょうか? まぁ,他の方の考えがわからないのでどこまで一般的なのか分からない所ではあったりしますが..

# snak (2005-06-30 12:33)

なるほど。

こんな感じでどうでしょう。
Boolean @Junk(String?)
第一引数は、空白区切りのトークンのリストで、アドレスにそのトークンが含まれるとホワイトだとみなされます。

例えばホワイトリストが少ないならば、
@Junk('@example.com')
@Junk('@example.com @foo.jp')
のように直接書けますし、別ファイルで管理したいならば、
@Junk(@Load('profiles/whitelist.txt'))
のようにしてwhitelist.txtの中に一行に一つずつドメイン名を記述していけば良いのではないかと。

# H.Aoyama (2005-06-30 13:05)

おー. いい感じですね. 私的には全く OK です.
確認ですが,その場合,ドメイン名は部分一致もアリ,でいいんでしょうか. その際の書き方は,regex ですか? そこまで凝らなくても,単純に存在する部分だけでチェック,でもいいですし,その方が分かりやすいとは思いますが.

例えば,

@domain.co.jp  ・・・ フルに指定した場合
dom.co.jp ・・・・ @XXX...XX.dom.co.jp にマッチ

あ,そっか... 後ろの部分をワイルドにしたい人っていますでしょうかね? う〜ん..

@*.domain.*  ・・・ XXX.domain.com や XXX.domain.org にマッチ

ここまで必要ない気もするし,ここまでやりたければやっぱりマクロでゴニョゴニョ...でしょうかね. ただ,ホスト名が複数という事はまぁ考えられそうな気がするので,前の部分だけは部分一致もアリにしてもらえると嬉しいとは思います(実はそういうメールが結構あるので(^^ゞ).

@host.domain.co.jp → 完全一致
domain.co.jp → XXX....XX.domain.co.jp に一致(期待しているのは,ホスト名部分がワイルドにマッチして欲しいという点)
 あるいは
@*.domain.co.jp
と書くか.

どうでしょうか?

# snak (2005-06-30 14:23)

単純な部分一致だけでいいかなと思っていましたが、もっと柔軟に指定できたほうが良いでしょうか。やるとしたら正規表現ですね。

# H.Aoyama (2005-06-30 14:57)

正規表現もアリだとは思うんですが,それはマクロで..でも良いと思うし,難しいですね. 自分的にも,どっちがいいのか迷っています.

とりあえず,単純な部分一致で,で良いのではないでしょうか.

domain.co.jp とリストに書いておけば,AA@a.sub.domain.co.jp にも,BB@domain.co.jp にも CC@c.domain.co.jp にもマッチしてもらえるなら,これで十分だと思いました. で,@domain.co.jp と書いた場合は 上の例の BB@〜のみにマッチする,という感じで.

[]