ここまで 2 回に分けて PostfixAdmin をインストール、設定した。
これで PostfixAdmin を使ってメールアカウントが管理できるようになったが、Postfix でこのメールアカウントが参照できなければ何の意味もない。
そこでここでは Postfix の設定を修正して、PostfixAdmin で管理しているメールアカウントを利用できるようにしたい。
Postfix については「ubuntu のインストール直後の調整 (その 3) [ローカル用 Postfix のインストール]」で書いたように、自分自身から送信されるメールのみを受け取って、受け取ったメールを全て別のメールサーバーに転送するように設定してある。
これを、外部から受け取ったメールの中で、PostfixAdmin で管理しているメールアドレス宛てのメールを保存、それ以外に宛てたメールは適切なメールサーバーに転送するように設定を変更する。
つまり、PostfixAdmin で管理しているメールアドレス (メールドメイン) を自メールサーバー宛てとみなす、 一般的なメールサーバーにするということだ。
PostfixAdmin が MySQL のデータベースに登録しているメールアカウントを Postfix で参照するためには、Postfix が MySQL に接続するための MySLQ のユーザアカウントが必要になる。
そこで、Postfix で使う MySQL のユーザーアカウントを MySQL で作成しておこう。
作成する MySQL のユーザーアカウント、およびそのパスワードは以下の通りとする。
| ユーザアカウント、パスワードは一例 | |
| ユーザアカウント | postfixuser |
|---|---|
| パスワード | postfixpass |
更に、 メールアカウントを登録しているデータベースを、このユーザーアカウントで参照できるような権限割り当てておく。
~$ echo "CREATE USER 'postfixuser'@'localhost' IDENTIFIED BY 'postfixpass';" | mysql -u root -p
~$ echo "GRANT SELECT ON postfixadmin.* TO 'postfixuser'@'localhost';" | mysql -u root -p
なお、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 の内容を、改めて以下に挙げておこう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 # See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = ******.example.jp
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname localhost.$mydomain localhost
relayhost = smtp.example.jp
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
local_recipient_maps = $alias_maps
さて、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 の内容は以下の通りだ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 # See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = ******.example.jp
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname localhost.$mydomain localhost
#relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
virtual_minimum_uid = 8
virtual_uid_maps = static:8
virtual_gid_maps = static:8
virtual_mailbox_base = /var/spool/mail/
virtual_mailbox_domains = proxy:mysql:$config_directory/virtual_domains.cf
virtual_mailbox_maps =
proxy:mysql:$config_directory/virtual_mailbox.cf
proxy:mysql:$config_directory/virtual_alias_domain_mailbox.cf
virtual_alias_maps =
proxy:mysql:$config_directory/virtual_alias.cf
proxy:mysql:$config_directory/virtual_alias_domain.cf
proxy:mysql:$config_directory/virtual_alias_domain_catchall.cf
inet_interfaces = ALL
local_recipient_maps = $alias_maps
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 ファイル) の内容は以下の通りだ。
/etc/postfix/virtual_mailbox.cfuser = postfixuser
password = postfixpass
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username = '%s' AND active = '1'
/etc/postfix/virtual_alias_domain_mailbox.cfuser = postfixuser
password = postfixpass
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox, alias_domain WHERE alias_domain.alias_domain = '%d' AND mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = '1'
見て分かるように、これらのファイルの 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:mysqlj:$config_directory/virtula_maildir.cf だけが指定してあればよく、proxy:mysqlj:$config_directory/virtula_alias_domain_maildir.cf を指定する必要は無い。
$CONF['alias_domain'] エントリを ‘YES’ にしてエイリアスドメインを登録した後に、これを削除しないままに $CONF['alias_domain'] エントリ ‘NO’ にしたときは、proxy:mysqlj:$config_directory/virtula_alias_domain_maildir.cf を必ず外しておかないといけないのは、言うまでもない。
main.cf ファイル中の行が前後するが、44 行目の viratual_mailbox_domains エントリに指定している $config_directory/virtual_domains.cf ファイル (/etc/postfix/virtual_domains.cf ファイル) の内容は以下の通りだ。
/etc/postfix/virtual_domains.cfuser = postfix
password = postfix
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '0' AND active = '1'
また、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 ファイル) の内容は以下の通りだ。
/etc/postfix/virtual_alias.cfuser = postfixuser
password = postfixpass
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address = '%s' AND active = '1'
/etc/postfix/virtual_alias_domain.cfuser = postfixuser
password = postfixpass
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias, alias_domain WHERE alias_domain.alias_domain = '%d' AND alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = '1' AND alias_domain.active = ‘1’
/etc/postfix/virtual_alias_domain_catchall.cfuser = postfixuser
password = postfixpass
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias, alias_domain WHERE alias_domain.alias_domain = '%d' AND alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = '1' AND alias_domain.active = '1'
ここで挙げたファイルの拡張子は全て .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/
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/
real.example.com/user/ と出力される。 最後に/etc/postfix/main.ccf ファイルの 35行目の relayhost エントリを削除し、53 行目の inet_interfaces エントリの値を ALL に変更する。
relayhost エントリは、Postfix を最終宛先にするドメイン以外に宛てたメールを転送するメールサーバーの指定なので、これを削除しないと、Postfix 自身で適切なメールサーバーに配送するという条件を満たせない。
inet_interface エントリは、Postfix がメールを受信するインターフェースの指定であり、元の loopback-only は Postfix がインストールされている PC 内部からの接続だけを受け付けるという指定だ。
これを ALL に変更することで、 Postfix がインストールされている PC に付いている全ての NIC からの接続を受け付けるようになる。
関連する記事 (Related posts):



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