centos selinux postfix spamassassin procmail fetchmail dovecot

部屋のメールサーバを、FreeBSD6(古)からCentOS5.3に移行しました。のでメモ...しようと思って、タイトルに関連しそうなキーワードを並べましたが、魑魅魍魎ですね。

とりあえず、いろいろ試した上での現状から。

  • Postfixがメールを受信します。
  • Postfixは受信したメールをSpamAssassinにかけたあと、各ユーザ(自分しかいないけど)にメールを配信します。
  • 配信されるユーザ(私)は $HOME/.forward の記述によって、配信されるメールをprocmailで振り分けます。
  • ユーザはimapsで、dovecotを経由してメールを見に来ます。

(おまけ)

  • ユーザ(私だってば)は10分おき位にfetchmailでプロバイダのメールを取得して、そのままPostfixにメールを渡します。(以後上記2行目へ)

spamassassinは、日本語のパッチが当たったユーザ会のsrpmをありがたく使わせていただきました。

http://spamassassin.jp/download/sa3.2/packages/rhel/


たぶん突っ込みどころはいろいろあるんですが...

PostfixSpamAssassinを使わせて、procmailには使わせないわけ

.forwardで実行されたprocmailが、SELinuxにはじかれてspamcもspamassassinも実行できませんでした。分不相応にEnforcingですよ。PermissiveとかDisabledにしてはずせば楽なのはわかってるんだけど。

procmailでハマり

MailDir形式を使用してます。一番最初に、.procmailrcにはこんな感じで記述してたですよ。

:0
*^X-Spam-Status: Yes
.spam

なんかdovecotからメールが読めない。中を見るとnew,cur,tmpといったフォルダができてて、newにメールを移動すればメールが見れるみたい。そこでさらに、

:0
*^X-Spam-Status: Yes
.spam/new

これで一応見れるけど、なぜかたまにサイズ0のファイルが出来上がる。procmailのログを見ると書き込みに失敗しているようで、以下のエラーが。

procmail: Couldn't create or rename temp file ".spam/new/msg.A"

そもそも振り分けられなかったファイルはもっと長いファイル名なのに、振り分けられたものはmsg.****のような短い名前。

頑張ってちゃんと調べてみたら、答えは意外なところにありました。

正解の.procmailrc

:0
*^X-Spam-Status: Yes
.spam/

最後のスラッシュがポイント。こうしないと、MailDir形式ではなくMH形式として振り分けてしまうんだそうな。(ちなみにここに載せてる.procmailrcは、冒頭での各種変数の指定は省略してます。念のため)

どうやら、上記の「サイズ0のファイルが出来上がる」原因もここにあったようで、procmailが.spam/newに作成した中身の書いてないファイルをメーラが読んで.spam/curに移動してしまい、中身が書けなくなったprocmailがエラーをはいて、処理できなかったメールをDEFAULTに置いていっちゃってたみたい。

エラーメッセージでググっていろいろ調べたけど、ここまでまとめてくれてるところがなくてはまってしまった...