Postfix: ローカルメール配送問題を解決

Mac OS X の /var/spool/mail/postfix/maildrop にファイルがいっぱい。[...]

これを消すのではなく、できれば普段使うアカウントへ配送したい。

PowerBook G4 購入以来のローカルメールが未配送であることがわかった一件、わりとあっさり解決することができた。

やりたいのは、/var/spool/mail/postfix/maildrop にたまったメールを、ローカル IMAP サーバ (Binc IMAP 1.2.12final) の INBOX に配送すること。
まず、/etc/aliases の root 宛メールの受取人を、普段使う一般ユーザにする。忘れがちだと思い、先にすませた。ここでは『me』としておく。以下抜粋。

# Person who should get root's mail. Don't receive mail as root!
root:           me

次に Postfix の設定を変える。/etc/postfix/main.cf の home_mailbox の値を、

home_mailbox = Library/Mairdir/INBOX/

とする。これは Binc IMAP の depot 設定を IMAPdir にしていて、そのうえ IMAP メールの在処が /Users/me/Library/Maildir の場合 (depot が Maildir++ の状況では使っていないので、わからない)。なお、名前のとおり qmail 流の Maildir を使っている。qmail 流の配送には、home_mailbox の値が / で終わっていることが大切。設定は postconf コマンドで確かめられる。-n オプションをつけると、デフォルト値以外に設定された変数だけ出力する。SMTP サーバとして使わない今回の目的では、/etc/postfix/master.cf は変更なし。

最後に、/etc/hostconfig を変更する。以下に抜粋するように、MAILSERVER の行を -NO- から、

MAILSERVER=-AUTOMATIC-

と変える。『-YES-』ではないことに注意。『-AUTOMATIC-』にすると、/usr/sbin/postfix-watch (ソース) が /var/spool/mail/postfix/maildrop ディレクトリを見張って、メールがあれば Postfix を起動、なくなれば終了させる、という仕事をする。

これで準備は整ったから、再起動。ログインする前からいつも以上に HDD が音を立てている。始まったみたい。top でプロセスを見ると、pickup, cleanup, qmgr, local が次々と実行され、~/Library/Maildir/INBOX にメールが配送されていく。約 1300 通、55MB のメールがあって、終わるまでに 7 分ぐらいかかった。

Apple Mail で見るとキャッシュを作るのに時間をとられてしまうと思い、Wanderlust でチェック。1000 通を超えるメールにちょっと社長さん気分。ほとんどが crontab 関連。一部は sudo の失敗など security まわり。crontab ものの内訳は、MO のマウントをさぼったときの pdumpfs のエラーと、この不具合に関連すると思われる、fetchmail 実行時のエラー (10.3.9 にしてから激減)。最後のメールを配送し終えて 1 時間後、Postfix のプロセスが終了。ちゃんと postfix-watch が働いている。

わからないこと。このメール掃除のあとに、sudo 認証を失敗する、MO をセットしない、という cron からのメール通知を引き起こす間違いをわざとしてみた。すると、sudo の方はメールが一旦くだんのキューにためられて、なかなか配送されてこない。結局 security 警告メールが配送されたのは、MO にバックアップする pdumpfs が crontab で走り出す時刻になってから。それに続いて、MO がないことを知らせる警告メールも送られていた。crontab の実行が引き金になるような仕組みは見当たらないんだけど...。

まあ、ほぼ一件落着。ところで、よく考えるとシステムからのメールには spam はないから、少なくとも個人的には scmail を通す必要はなかった。一日数通だし、見たらすぐ捨てるから自動振り分けも要らないし。