ubuntu 10.04 をメールサーバーに (Postfix と PostfixAdmin の連携)

ここまで 2 回に分けて PostfixAdmin をインストール、設定した。
これで PostfixAdmin を使ってメールアカウントが管理できるようになったが、Postfix でこのメールアカウントが参照できなければ何の意味もない。
そこでここでは Postfix の設定を修正して、PostfixAdmin で管理しているメールアカウントを利用できるようにしたい。

Postfix については「ubuntu のインストール直後の調整 (その 3) [ローカル用 Postfix のインストール]」で書いたように、自分自身から送信されるメールのみを受け取って、受け取ったメールを全て別のメールサーバーに転送するように設定してある。
これを、外部から受け取ったメールの中で、PostfixAdmin で管理しているメールアドレス宛てのメールを保存、それ以外に宛てたメールは適切なメールサーバーに転送するように設定を変更する。

つまり、PostfixAdmin で管理しているメールアドレス (メールドメイン) を自メールサーバー宛てとみなす、 一般的なメールサーバーにするということだ。

PostfixAdmin が MySQL のデータベースに登録しているメールアカウントを Postfix で参照するためには、Postfix が MySQL に接続するための MySLQ のユーザアカウントが必要になる。
そこで、Postfix で使う MySQL のユーザーアカウントを MySQL で作成しておこう。
作成する MySQL のユーザーアカウント、およびそのパスワードは以下の通りとする。

ユーザアカウント、パスワードは一例
ユーザアカウント postfixuser
パスワード postfixpass

更に、 メールアカウントを登録しているデータベースを、このユーザーアカウントで参照できるような権限割り当てておく。

postfixuser と postfixpass は上で挙げたユーザアカウントとパスワードの一例。
なお、postfixpass は、MySQL の IDENTIFIED BY 句で暗号にして記録されるので、平文のまま記述すればいい。

それぞれの行の実行毎に 'Enter Password:' のプロンプトが表示されるので、MySQL をインストールしたときに設定した MySQL の root ユーザーのパスワード (ubuntu の root ユーザーではない) を入力して、Enter を押す。
これで MySQL に作られた PostfixAdmin のデータベースに、Postfix から接続するためのユーザーアカウントの登録と権限の割り当てができた。

Postfix 自体は「ubuntu のインストール直後の調整 (その 3) [ローカル用 Postfix のインストール]」でインストール済みなので、ここではその設定を変更するだけになる。
Postfix の設定は主に /etc/postfix/main.cf ファイルに記述されている。
とりあえずは Postfix のインストール時に作成され、「ubuntu のインストール直後の調整 (その 3) [ローカル用 Postfix のインストール]」でごく僅かに修正した /etc/postfix/main.cf の内容を、改めて以下に挙げておこう。

上記記述の中で ******.example.jp はシステムメール名、smtp.example.jp はインストールの際にリレーホストのダイアログで入力した FQDN。

さて、PostfixAdmin が管理しているメールアドレス宛てのメールを Postfix が保存するに当たって、「ubuntu 10.04 をメールサーバーに (承前) 」で述べた条件を思い出して欲しい。
そこには「メールアカウントを ubuntu のユーザーアカウントから独立させる」といった条件があった。
これ自体は Postfix が標準で備えている virtual(8) の機能を使えば実現できる。
具体的には、Posfix の設定ファイルである /etc/postfix/main.cf ファイルで、virtual_mailbox_domains や virtual_mailbox_maps、virtual_mailbox_base などのエントリを適切に記述すればいい。

Postfix はこれらのエントリの指定されたファイルの内容に基づいて、受信したメールの宛先アドレスや宛先ドメインをキーに検索を行い、その結果を利用する。
利用の仕方はエントリに寄って様々だ。
例えば virtual_maibox_maps エントリであれば、検索した結果はメールを保存するディレクトリ名になり、virtual_mailbox_domains エントリであれば、検索結果の有無によってそのメールを virtual(8) で処理するかどうかが決められる。

さて、PostfixAdmin で管理しているメールアドレス宛てのメールを保存、それ以外に宛てたメールは適切なメールサーバーに転送するように設定したときの main.cf の内容は以下の通りだ。

40 行目から 51 行目までを、今までの main.cf に追加した。
また 35 行目を削除し、53 行目を修正した。

41 行目と 42 行目では、受信したメールを保存するときのユーザー ID とグループ ID を指定している。
ここで指定している 8 という数値は、mail ユーザーのユーザー ID (41 行目の virtual_uid_maps) と、mail グループのユーザー ID (42 行目の virtual_gid_maps) であり、それぞれ別の意味を持つ数値だ。
なお、40 行目の virtual_minimum_uid エントリは、41 行目の vritual_uid_maps エントリで与えられるユーザー ID の値の最小値を制限しているだけに過ぎない。

43 行目の virtual_mailbox_base エントリは、受信したメールを保存する基準になるディレクトリの指定だ。
ここで指定したディレクトリは、41、42 行目の virtual_uid_maps と virtual_gid_maps で指定しているユーザー ID、グループ ID で書き込めなくてはならない。
実際にメールを書き込むディレクトリは、この virtual_mailbox_base エントリと 45 行目からの virtual_mailbox_maps エントリの値を結合することで得られる。

virtual_mailbox_maps エントリには、proxy:mysql:$config_directory/vritual_mailbox.cf と proxy:mysql:$config_directory/vritual_alias_domain_mailbox.cf の二つの値が指定されている。
これらの値の '$config_directory/vritual_mailbox.cf' と '$config_directory/vritual_alias_domain_mailbox.cf' はメールアドレスを元にメールを保存するディレクトリを検索するための方法を記したファイル名だ ('$config_directory' は main.cf ファイルのあるディレクトリを示す)。
ファイル名の前の 'proxy:mysql:' は、MySQL を使って検索することを指定している。
このように二つの値が指定されたとき、Postfix はその値を順に使って最初に得られた結果を使うようになっている。

$config_directory/virtual_mailbox.cf ファイルと $config_directory/virtual_alias_domain_mailbox.cf ファイル (main.cf ファイルは /etc/postfix ディレクトリにあるので、これらのファイルは実際は /etc/postfix/virtual_mailbox.cf ファイルと /etc/postfix/virtual_alias_domain_mailbox.cf ファイル) の内容は以下の通りだ。

postfixuser と postfixpass は上で作成した MySQL のユーザーアカウントとパスワード。

見て分かるように、これらのファイルの user エントリと password エントリには、先に MySQL に登録した Postfix が MySQL に接続するための MySQL のユーザアカウントとパスワードを指定し、hosts エントリには MySQL サーバーが動くホストを指定する。
今回は、Postfix をインストールしたホストに MySQL をインストールしたので、hosts エントリには 'localhost' と指定している。
dbname エントリに指定するのは、検索対象データが保存されているデータベース (PostfixAdmin がメールアカウントを保存しているデーターベース) の名前だ。
query エントリには、データベースを検索するときの SQL 文を指定する。
Postfix がこの query エントリに指定した SQL 文を呼び出すときは、WHERE 節に現れる '%s' は宛先のメールアドレスに置き換えられ、%d はそのメールアドレスのドメイン部 (@ よりも右側) に、%u はそのメールアドレスのユーザー部 (@ よりも左側) に置き換えられる。
mailbox テーブルの maildir フィールドには、PostfixAdmin によって以下のような値が保存されている。

user は対応するメールアカウントのユーザー部、domain は対応するメールアカウントのドメイン部
PostfixAdmin の設定ファイルの以下のエントリの値 maildir フィールドの値
$CONF['domain_path'] $CONF['domain_in_mailbox']
YES YES domain/user@domain/
NO domain/user/
NO user@domain/

$config_directory/virtual_mailbox.cf ファイル (/etc/postfix/virtual_mailbox.cf ファイル) の query エントリに指定している SQL 文は、この mailbox テーブルを検索して、与えられたメールアドレスに該当する maildir フィールドを返すようになっている。

$config_directory/virtual_alias_domain_mailbox.cf ファイル (/etc/postfix/virtual_alias_domain_mailbox.cf ファイル) の query エントリは、PostfixAdmin で登録したエイリアスドメイン宛てのメールを保存するディレクトリを得るための SQL 文を指定している。
PostfixAdmin のエイリアスドメインとは、あるドメイン宛てのメールを別のドメインでも受信できるようにする機能だ。
例えば、real.example.com のエイリアスドメインに alias.example.com を 登録すると、user1@real.example.com というメールアドレスは、このアドレス以外に user1@alias.example.com 宛てのメールも受信することができるようになる。
エイリアスドメインは PostfixAdmin の設定ファイルの $CONF['alias_domain'] エントリを 'YES' にしたときだけ有効になる。

$CONF['alias_domain'] エントリを 'NO' にしているときは、Postfix の main.cf ファイルの virtual_mailbox_maps エントリには proxy:mysql:$config_directory/virtula_maildir.cf だけが指定してあればよく、proxy:mysql:$config_directory/virtula_alias_domain_maildir.cf を指定する必要は無い。
$CONF['alias_domain'] エントリを 'YES' にしてエイリアスドメインを登録した後に、これを削除しないままに $CONF['alias_domain'] エントリ 'NO' にしたときは、proxy:mysql:$config_directory/virtula_alias_domain_maildir.cf を必ず外しておかないといけないのは、言うまでもない。

次で説明する virtual_mailbox_domains エントリに指定する virtual_domains.cf での検索結果にも影響するので、登録したエイリアスドメインを削除しないまま $CONF['alias_domain'] エントリを 'NO' にすること自体が、既に問題を孕んだ行為と言える。

main.cf ファイル中の行が前後するが、44 行目の viratual_mailbox_domains エントリに指定している $config_directory/virtual_domains.cf ファイル (/etc/postfix/virtual_domains.cf ファイル) の内容は以下の通りだ。

postfixuser と postfixpass は上で作成した MySQL のユーザアカウントとパスワード。

また、48 行目からの virtual_alias_maps エントリに指定している $config_directory/virtual_alias.cf ファイル (/etc/postfix/virtual_alias.cf ファイル) と $config_directory/virtual_alias_domain.cf ファイル (/etc/postfix/virtual_alias_domain.cf ファイル)、$config_directory/virtual_alias_domain_catchall.cf ファイル (/etc/postfix/virtual_alias_domain_catchall.cf ファイル) の内容は以下の通りだ。

postfixuser と postfixpass は上で作成した MySQL のユーザアカウントとパスワード。
ここで作成したこれらのエントリで指定しているファイルの名前や拡張子に特に制限はない。
ここで挙げたファイルの拡張子は全て .cf であるが、別の拡張子でも (拡張子が無くても) かまわない。

ここで作成したこれらのエントリで指定しているファイルが、正しく記述されているかを調べるには、 postmap コマンドを使用する。
当然であるが、その前にメールアカウントなどを、PostfixAdmin の Web インターフェースを使って登録しておく必要がある。
例として、user@real.example.com というメールアカウントを PostfixAdmin で登録したとしよう。
postmap -q user@example.com mysql:/etc/postfix/virtual_mailbox.cf コマンドを実行したときに、以下の結果が出力されれば /etc/postfix/virtual_mailbox.cf ファイル ($config_directory/virtual_mailbox.cf ファイル) は正しく記述されている。

user@real.example.com/
PostfixAdmin の設定ファイルで $CONF[''domain_path] が ’YES'、$CONF['domain_in_mailbox'] が 'NO' になっているときは、 real.example.com/user/ と出力される。

他のファイルについても同様の方法で調べられる。
上の例に追加して alias.example.com を real.example.com のエイリアスドメインに追加しておけば、 ~$ postmap -q user@alias.example.com mysql:/etc/postfix/virtual_alias_domain_mailbox.cf コマンドを実行して、viratual_alias_domain_mailbox.cf ファイルの記述を確認できる。

user@real.example.com/
PostfixAdmin の設定ファイルで $CONF[''domain_path] が ’YES'、$CONF['domain_in_mailbox'] が 'NO' になっているときは、 real.example.com/user/ と出力される。

最後に /etc/postfix/main.cf ファイルの 35行目の relayhost エントリを削除し、53 行目の inet_interfaces エントリの値を ALL に変更する。
relayhost エントリは、Postfix を最終宛先にするドメイン以外に宛てたメールを転送するメールサーバーの指定なので、これを削除しないと、Postfix 自身で適切なメールサーバーに配送するという条件を満たせない。

relayhost エントリを削除すると、Postfix は DNS を使って送り先のメールサーバーを探すようになるので、Postfix がインストールされている PC で DNS が正しく引けていないといけない。

inet_interface エントリは、Postfix がメールを受信するインターフェースの指定であり、元の loopback-only は Postfix がインストールされている PC 内部からの接続だけを受け付けるという指定だ。
これを ALL に変更することで、 Postfix がインストールされている PC に付いている全ての NIC からの接続を受け付けるようになる。

関連記事

「ubuntu 10.04 をメールサーバーに (Postfix と PostfixAdmin の連携)」への2件のフィードバック

  1. このページを参考に設定できました。ありがとうございます。
    しかし、 /etc/postfix/virtual_domains.cf のところで少し表示がおかしいようです。

    user = your postfixadmin
    password = your postfixadmin password
    hosts = localhost
    dbname = postfixadmin
    table = domain
    select_field = domain
    where_field = domain
    additional_conditions = and backupmx = ‘0’ and active = ‘1’

    ではないでしょうか。
    http://ubuntuwiki.net/index.php/Postfix,_Virtual_Domain_Setup

    1. ご指摘ありがとうございます。
      記事中の HTML タグが崩れていたせいで、/etc/postfix/virtual_domains.cf ファイルの内容が表示されない上に、別の文字列がファイル内容の位置に表示されてしまっていたようです。
      早々に修正いたしました。

コメントを残す