彷徨えるフジワラ

年がら年中さまよってます

postfix の設定

例によって随分放置してしまったけど、自宅サーバの MTA を sendmail から postfix に入れ替える作業を。

これまでの自宅サーバは、MTA に postfix を使い、Maildir 形式で保存したものを、IMAP サーバ経由でアクセスしていた。

その一方、Solaris のデフォルト MTA は sendmail で、当然格納形式は mbox 形式一択(だよね? > sendmail)。標準 IPS 上では他の MTA パッケージは公開されておらず、Maildir 形式の MTA を使うには:

  • sunfreeware とかの外部 IPS で公開されているパッケージを使用
  • ソースからビルド

のいずれかを選択する必要がある。

もういい加減、オプション指定に凝った configure & make が楽しい年齢でも無い(嘘。着手するまでは面倒だけど、やり始めると凝らずにはいられない)ので、パッケージのインストールで済ませたいのだが、公開されているパッケージのバージョンを見ると、やはり更新への追従性は良くない感じ。

ということで、結局ソースからビルドすることに。
もっとも Postfix のビルドは configure 無しの make 実施のみで、Solaris は既にサポート対象プラットフォームであることから、CC マクロに SunStudio のコンパイラを指定すれば特に問題無く完了。つまり問題なのは、設定ファイルの記述の方。

postfix の設定ファイル編集なんて、自宅サーバを立ち上げて以来なので、8 年ぶりぐらいか?っつーか、これだけご無沙汰だと、最早「初めての postfix」と言っても過言では無いよなぁ。

で、特に凝った事(例: virtual host とか)をやるつもりは毛頭無いのと、幸いにも以前の自宅サーバの設定ファイルが無事サルベージできているので、(1) "make install" での対話入力も、(2) ドメイン名等に関する事後設定も、とりあえずは以前の設定を参考に実施。

ちなみに、以前の自宅サーバでの設定では Maildir 形式格納を指示する記述が無いのだけど、そもそも postfix ってどこで設定するの?と暫しネットの海を彷徨った後で、各アカウントの ~/.forward における "~/Maildir/" 記述(肝心なのは末尾のスラッシュ)によって、格納形式が Maildir に切り替わることを思い出した。

この方式だと、アカウント毎の設定の有無次第でスプールディレクトリ配下への mbox 形式格納も有り得る=障害発生時の確認先が増える、ってことだから、運用方針として微妙じゃね?という気もするのだが、そもそも ~/Maildir/ が作成されていないアカウントへの配信の場合に、自動的にディレクトリの作成までやってくれるんだっけ? > postfix

実際のメール格納に当たっては、~/Maildir/ だけでは不十分で、配下に cur とか new とかが必要なんだけど、これらを手動作成した憶えが無いので、大丈夫そうな気もするのだが.... とりあえず、一通り動作確認してから試してみよう。

で、肝心の動作確認なのだが、mail コマンドでのローカルユーザへの送信で、まずは以下の様なエラーがコンソールと /var/adm/messages に:

fatal: unsupported dictionary type: hash

hash ファイル形式が不正?現状で hash 形式の指定が明示されてるのって alias_maps だけなのだが:

alias_maps = hash:/etc/postfix/aliases

この設定項目は、設定例に hash を使ったエントリを掲載しているぐらいだから、流石に hash 形式未サポートってことは無いよね?

何か原因が見えてくるかも?ということで、試しに mdb 形式の設定を有効にした上で、newaliases を実施してみると:

postalias: fatal: open /etc/mail/aliases: No such file or directory

あれ? /etc/postfix/main.cf でのパス設定って見てないの?truss を掛けてみたら、一応 /etc/postfix/main.cf は読んでいた。そうなると、以前の自宅サーバではコメントアウト状態だった alias_database 設定の方を見てる? > newaliases@postfix

そこで /etc/postfix/main.cf.default に出力されているデフォルト設定情報を確認すると、確かに alias 系の設定は全て /etc/mail/aliases に振り向けられている模様。

っちゅーことで、alias_maps および alias_database を共に mdb:/etc/postfix/aliases に設定すると、newaliases もメール配送も無事成功!

うーむ、サポートして無いなら設定例から外して欲しいなぁ > hash 形式@main.cf

以前の設定が上手く機能していた理由を確認する上で、ext2 からのサルベージシンボリックリンクが回収出来なかった、ってのは痛いのだが、まぁ、postfix の版依存の可能性もあるから、とりあえず放置ってことで。

さて、ここまで出来たら勝ったも同然、ということで fetchmail での動作確認をやってみる。

collect: Cannot write ./dfoA1EklWn003083 (bfcommit, uid=0, gid=25): \
    No such file or directory

全然負けてる .... orz

あれ〜?mail コマンドでの送信は成功しているのに、何で失敗するんだ? > fetchmail

ログメッセージだけでは今ひとつ原因がわからないので、詳細情報を得るために -v 付きで fetchmail を起動。すると、SMTP セッション開始時点でサーバが返してくる文字列に sendmail の文字が!

は?!sendmail!? postfix のインストール前に pkg uninstall したのに?言われてみれば、ログ出力も sendmail 名義で行われている。

.... 思い出した。svcadm で sendmail を disable するのを忘れてた .... orz

そりゃ上手く動くわけねーよ!25 番ポートで待っているのは sendmail だけど、そもそも sendmail のための設定なんて何もやってないんだから!

先の mail コマンドによる配信が上手く機能したのは、宛先としてローカルアカウントを指定した送信だったから、おそらく SMTP を喋ってなかったんだな。

"svcadm disable svc:/network/smtp:sendmail" で sendmail を停止させようとしたけど、既に "pkg uninstall" 済みなために必要なファイルが軒並み無くなっているのが災いしたのか、maintenance モード止まりで disabled にならない。しょうがないので一旦再起動することに。

# ついでに svc:/network/sendmail-client:default も停止

svcs コマンドで sendmail が disabled なことを確認したうえで、(SMF 設定を実施してないので)手動で postfix を起動。再度 fetchmail の実行を試みてみると .... 成功した!祝福せよ!っつーか、お前、馬鹿だろ? > 自分

ちなみに、~/Maildir/ 不在時の自動作成に関しては、/etc/postfix/main.cf での home_mailbox 記述を Maildir/ に設定(+ 排他関係にある mail_spool_directory を無効化)した上で、~/Maildir/ を持たないアカウントにメール送信してみたところ、あっさりと Maildir ディレクトリが新規作成される模様。やるなぁ、postfix