88171.net

I stand with Ukraine🇺🇦

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