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 って。まぁ知ってたけど。