88171.net


Sieve入れてみた

とかさんざんdisっておきながら、結局DovecotのSieveプラグインを入れてるというこのザマね。

念のため言っておくと、配送時に特定条件でIMAPフラグをいじる方法が現実問題として他になくて、仕方なく入れたんだからね。言語仕様はやっぱりどうしようもなく気持ち悪いし、implicitな挙動があれこれあって念入りに sieve-test しないと怖くて使えたもんじゃないし、実装毎の独自拡張がざらにあったりする時点でお察しですよ。まぁsyntaxの気持ち悪さという点ではProcmailも相当だけど、俺的にはProcmailの方が全然食える。

とまぁ誰得なヘイトを撒き散らした (もしくは自分が如何に古臭い人間かを晒した) ところで、導入メモ。

要件整理

大きな要件は以下の二つ。

  1. ベイジアンフィルタ (具体的にはBogofilter ) でspam判定されたメールをJunkフォルダに振り分ける。

  2. ヘッダ・本文中の文字列パターンに応じてフォルダに振り分ける、もしくはIMAPフラグを立てる。

前者がSieveにとっては鬼門。Procmailなら判定と振り分けをたった2行で書けるのに、Sieveにはそもそも個別のユーザ権限で外部コマンドを叩く術が存在しない。あーはいはい、セキュリティ万歳、アーキテクチャ非依存万歳。ベイジアンフィルタは各ユーザが独自にDB管理できて然るべきだろjk、とか語っても始まらないので、百歩譲って (どうせこのサーバのユーザは俺一人だし‥‥) After-Queue Content Filterの仕組みを使ってPostfixのレイヤーでBogofilterに通し、Sieveではヘッダを見て振り分けることにした。 extprogramsでもイケるのかもしれないけど、できるだけSieveの深みには嵌まりたくない。

後者はさすがに余裕だろ、とか思ってたら落とし穴があって、 少なくともDovecotのSieve実装であるところのPigeonhole (0.3.1) では、bodyを :regexにかけると ^$ がいずれかの行の先頭・末尾 ではなく bodyの先頭と末尾にしかマッチしない。あーはいはい、bodyが一つのstringなんですね。もう :containsでいいよ好きにしろ。

設定方法とか

ターゲット環境がDebian wheezy標準のPostfix + Dovecot + Bogofilterであることは大前提。

1. mailbox_command でLDAをDovecotに

2. smtpdを経由するメールがBogofilterを通るように

3. Dovecot Sieveプラグインのインストールと設定

4. ユーザ用Sieveスクリプトの準備と配置

5. (option) 再学習の仕組み作り

Arrange for users to send misclassified mail to a particular mailbox and make sure that the database is updated regularly.

file:///usr/share/doc/bogofilter/integrating-with-postfix

感想

設定が済んでちゃんと動作してるのが無事確認できてしまうと、まぁそこそこの満足感があったりするのがSEとしての悲しい性なのだけど、一方でSieveを導入したことでこれからチョー夢がひろがりんぐ、とは全く思えないので、労力に見合うだけの価値があるかと聞かれれば、否。既にProcmailとかmaildropとかでバリバリ設定作り込んでるユーザが「Sieve、いいなぁ‥‥」とか反射的にヨダレ垂らす類のもの じゃない のはきっと間違いない。Sieveにしかできないことなんてほとんどないし。

要は、ユーザみんなvirtualなんで古き良き手法じゃユーザ個別のフィルタリングとか無理なんですよね、みたいなそこそこデカいメールシステムを作るときにManageSieveとか共通スクリプトとかガンガン使いつつキモいところはUIでうまく隠蔽してほらフィルタリングできますよvacationだって飛ばせますよとか売り込みたい、そんなSIerポジションな皆様向けの機能だと思うんですよね、Sieveって。まぁ知ってたけど。