Postfix の main.cf のフォーマットについて

これは Postfix Advent Calendar 2014 の2日目の記事です。

Postfix が登場する以前、MTA と言えば Sendmail でした。Sendmail の設定ファイル sendmail.cf は人間が読むことも書くことも難しくて、設定ファイルを簡単に書くためのツールがいくつかあるくらいでした。それに比べたら Postfix の設定ファイルはかなり簡単です。

Postfix の重要な設定ファイルは主に2つあります。master.cf と main.cf です。

今回は main.cf のフォーマットについて詳しく書いてみます。

基本形式

基本は次の形式です。簡単です。

パラメータ名 = 値

「=」の前後の空白はあってもなくても構いません。また行末の空白文字は無視されます。

コメント

#」で始まる行はコメントです。

# コメント

#」は必ず行頭になければなりません。次のように書いてもパラメータの値の一部として扱われます。

パラメータ名 = 値 # コメント

空白

空白は書いたとおりにパラメータの値となります。ただし、先頭と末尾の空白は除去されます。

値に連続した空白を含む場合、postconf コマンドの出力では一つの空白として見えますが、実際には複数の空白がそのまま維持されています。

# grep smtpd_banner /etc/postfix/main.cf
smtpd_banner = a  b   c                    ← 連続した空白を含む値を指定
# postconf smtpd_banner
smtpd_banner = a b c                       ← postconf の出力では1個になっているが
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 a  b   c                               ← 設定した通りの値が使用される

複数の値を取るパラメータの場合は空白はカンマ(,)と共に区切り記号として扱われます。 値の間の空白はいくつ連続していてもひとつの区切りとして扱われます。

継続行

空白で始まる行は直前の行からの継続行として扱われます。

パラメータ名 =
 値1
  値2
   値3

改行は無視されますが、空白はそのまま残ります。ですので上の例だとパラメータ値は「値1 値2 値3」となります。

また、継続行の途中にコメント行を入れることもできます。

パラメータ名 =
  値1
# 値2
  値3

これは、「値1 値3」として扱われます。

パラメータ値の展開

パラメータの値の中で他のパラメータの値を展開することができます。

param1 = value
param2 = $param1

main.cf 中の記述順には影響しません。次のように書いても同じ結果になります。

param2 = $param1
param1 = value

パラメータ値を展開するための記述方法は「$param」、「${param}」、「$(param)」です。直後に別の文字が続くような場合は括弧つきの表記を使うのがよいでしょう。

$」をそのまま「$」として扱いたい場合は「$$」と記述します。

${param?value}」は param の値が空でない場合に value の値になります。param が空の場合は空のままです。

${param:value}」は param の値が空の場合に value の値になります。param が空でない場合は空になります。

括弧は {} でも () でも構いません。

value 部分でさらに他のパラメータを展開することができます。

param = ${param1?${param2:hoge}}

これは param1 が空でなく param2 が空の場合に param の値が「hoge」になり、それ以外の場合は空の値になります。

param に値がある時と空の時でそれぞれ異なる値を設定したい場合は次のようにするのがよいでしょう。

パラメータ名 = ${param?abc}${param:xyz}

ユーザー定義パラメータ

パラメータは Postfix であらかじめ定義されたもの以外に、自分で定義することもできます。

当然ですが直接 Postfix の動きに作用することはできません。できるのは、他のパラメータの値の中に展開することくらいです。

パラメータ名は ASCII 英数字と「_」です。数字だけのパラメータ名でも特に問題ないようです。

ユーザー定義パラメータを main.cf に記述して、そのパラメータがどこからも参照されない場合は、warning が出力されます。

# postconf -e 'hoge = abc'
# postfix reload
/usr/sbin/postconf: warning: /etc/postfix/main.cf: unused parameter: hoge=abc
postfix/postfix-script: refreshing the Postfix mail system

Postfix の設定ファイルの記述は簡単なのですけど、詳しく見てみたら何か新しい発見があるかと思って調べてみました。自分にとっては連続した空白の扱いが新たな発見でした。みなさんも何か新しい発見があったでしょうか。