Sieve入れてみた
「安全な範囲で可能な限り柔軟にメールのフィルタリングポリシー書かせまっせ」というSieveの設計思想は理解できるんだけど、セキュリティはこっちでケツ持つから外部コマンドの一つくらい叩かせろや、と正直思う。あと中途半端にLLっぽいsyntaxが単純に気持ち悪くて嫌い。
おっかわ (@hrkokw) 12:03 AM - 06 Mar 2015
とかさんざんdisっておきながら、結局DovecotのSieveプラグインを入れてるというこのザマね。
念のため言っておくと、配送時に特定条件でIMAPフラグをいじる方法が現実問題として他になくて、仕方なく入れたんだからね。言語仕様はやっぱりどうしようもなく気持ち悪いし、implicitな挙動があれこれあって念入りに sieve-test
しないと怖くて使えたもんじゃないし、実装毎の独自拡張がざらにあったりする時点でお察しですよ。まぁsyntaxの気持ち悪さという点ではProcmailも相当だけど、俺的にはProcmailの方が全然食える。
とまぁ誰得なヘイトを撒き散らした (もしくは自分が如何に古臭い人間かを晒した) ところで、導入メモ。
要件整理
大きな要件は以下の二つ。
-
ベイジアンフィルタ (具体的にはBogofilter ) でspam判定されたメールをJunkフォルダに振り分ける。
-
ヘッダ・本文中の文字列パターンに応じてフォルダに振り分ける、もしくは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に
- LDA/Postfix - Dovecot Wiki
- うちは末端の配送処理は既にDovecot LDAに任せてたので、これだけ。そうでなければもちろんLDA自体の設定も必要。
2. smtpdを経由するメールがBogofilterを通るように
- file:///usr/share/doc/bogofilter/integrating-with-postfix
- Postfix After-Queue Content Filter
- ミスるとエラいことになるので、慎重に。
3. Dovecot Sieveプラグインのインストールと設定
apt-get install dovecot-sieve
- Pigeonhole/Sieve/Configuration - Dovecot Wiki
4. ユーザ用Sieveスクリプトの準備と配置
- start - Sieve.Info
- mozdev.org - sieve: reference
- Pigeonhole/Sieve/Examples - Dovecot Wiki
man sieve-test
←重要
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
- メールを直に流すなり定期的に拾うなり、何らかの方法でBogofilterコマンドを叩くようにすればいい。
- イタズラされたりしないように多少の考慮は必要 (なのでこっちの手の内は明かさない ;-)
感想
設定が済んでちゃんと動作してるのが無事確認できてしまうと、まぁそこそこの満足感があったりするのがSEとしての悲しい性なのだけど、一方でSieveを導入したことでこれからチョー夢がひろがりんぐ、とは全く思えないので、労力に見合うだけの価値があるかと聞かれれば、否。既にProcmailとかmaildropとかでバリバリ設定作り込んでるユーザが「Sieve、いいなぁ‥‥」とか反射的にヨダレ垂らす類のもの じゃない のはきっと間違いない。Sieveにしかできないことなんてほとんどないし。
要は、ユーザみんなvirtualなんで古き良き手法じゃユーザ個別のフィルタリングとか無理なんですよね、みたいなそこそこデカいメールシステムを作るときにManageSieveとか共通スクリプトとかガンガン使いつつキモいところはUIでうまく隠蔽してほらフィルタリングできますよvacationだって飛ばせますよとか売り込みたい、そんなSIerポジションな皆様向けの機能だと思うんですよね、Sieveって。まぁ知ってたけど。