新しいメールフィルタを開発 (Dovecot LDA, Postfix alias/PIPE)
server
- TOP
- Old Archives
- 新しいメールフィルタを開発 (Dovecot LDA, Postfix alias/PIPE)
新手のスパムが増えてきたので、追加のスパムフィルタを適用しようとしたのだが、従来のスパムフィルタがちょっと力技過ぎて(まぁ、2時間で作ったものだから)拡張が難しかったので、新しいフレームワークを作った。
GitHubで公開しているけれど まだREADMEを書いていないので利用は難しいだろう。
これ自体は大した話ではないのだが、部分的にとても苦戦したところがあったので、その話をしよう。
旧フィルタはPostfix
aliasのPIPEで起動し、通過したものはsendmail
でキューに戻すという仕様だった。
これは問題なかったのだが、フォルダへの振り分けも行いたい(特にJunk
フォルダに対して振り分けたい)という理由でDovecot
LDAを使うことにした。 これはArch
Linuxだと/usr/lib/dovecot/dovecot-lda
である。
だが、ここで問題があった。Dovecot LDAはメールボックスに配送する。 一方Postfix sendmailはキューに入れるだけで、メールボックスへの配送はPostdropが行う。
だが、PostfixはPIPEをnobody:nobody
で起動する。
だから、メールボックスに対するアクセス権がなく、Dovecot
LDAでメールボックスに配送することができない。
PIPEのユーザーを指定して起動する方法を検討したのだが、公式Wikiに「suidしろ」とか書いてあって絶望した。
ここまで特定するのに随分苦労したが、結局Postfix Sendmail同様、サーバーに対して送信する、という仕組みにすることにした。 rootで起動されているサーバーがDovecot LDAを呼ぶのでroot権限で動かすことができる。
これを実現するためにRubyのUNIXServer
インスタンス(socketファイル)を777
にしてあげる必要があるのだが、
UNIXServer.open
にその機能がないため、
UNIXServer.open(LDA_SOCK_PATH) do |serv|
File.chmod(0777, LDA_SOCK_PATH)
という感じ。
また、ログファイルもnobodyで書き込める必要がある。