Postfixのvirtual_mailboxをPostgreSQLで管理


いよいよPostfix導入実験の山場へと来た。
virtual_mailboxを使って、メールアカウントをOSのアカウントから分離して扱うための実験を始める。

まずは、PostgreSQLにvirtual_mailboxで使うテーブルを用意する。
今回用意するテーブルは2つ。
一つはvirtual_mailboxで扱うドメイン名のリスト。
もう一つはvirtual_mailboxで扱うメールアカウントの情報。

ドメイン名のリストは
CREATE TABLE virtual_domains (
record_id    serial    PRIMARY KEY,
domain       TEXT      NOT NULL,
status_flag  SMALLINT  DEFAULT 0,
note         TEXT
);
GRANT SELECT ON TABLE virtual_domains TO postfix;
と言った感じ。
基本的にエイリアス用に作ったテーブルと考え方は同じで、基本的にはドメイン名を格納するカラムがあればいい。

メールアカウントの情報は
CREATE TABLE virtual_maps (
record_id    serial    PRIMARY KEY,
login_id     TEXT      NOT NULL,
password     TEXT      NOT NULL,
address      TEXT      NOT NULL,
maildir      TEXT      NOT NULL,
status_flag  SMALLINT  DEFAULT 0,
note         TEXT
);
GRANT SELECT ON TABLE virtual_maps TO postfix;
と言う風になり、受信する時に使うログインIDとパスワードがあり、メールアドレスとスプール先のディレクトリ情報を格納している。

それぞれにテスト用のデータを入れてやる。
INSERT INTO virtual_domains (domain,status_flag) VALUES ('sample.com',1);
INSERT INTO virtual_maps (login_id,password,address,maildir,status_flag) VALUES ('vm0001','password','testmail@sample.com','vm/vm0001/',1);

続いて /etc/postfix/main.cf にvirtual_mailboxの設定を追記する。
virtual_transport = virtual
virtual_minimum_uid = 100
virtual_uid_maps = static:10000
virtual_gid_maps = static:10000
virtual_mailbox_base = /var/mail
virtual_mailbox_domains = pgsql:/etc/postfix/pgsql-virtual_domains.cf
virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-virtual_maps.cf
virtual_mailbox_limit = 51200000
virtual_mailbox_lock = fcntl, dotlock
と言う感じで基本的にはデフォルト値のコピー。

virtual_mailbox_domains用のPostgreSQLの設定情報を用意する。
ファイルはmain.cf内に書いた /etc/postfix/pgsql-virtual_domains.cf で
hosts    = unix:/tmp
user     = postfix
password = *******
dbname   = postfix
 
select_field = domain
table        = virtual_domains
where_field  = domain
additional_conditions = and status_flag = 1

もう一つ、virtual_mailbox_maps用のPostgreSQLの設定情報を用意する。
ファイルはmain.cf内に書いた /etc/postfix/pgsql-virtual_maps.cf で
hosts    = unix:/tmp
user     = postfix
password = *******
dbname   = postfix
 
query = SELECT maildir || 'Maildir/' FROM virtual_maps WHERE address = '%s' AND status_flag = 1
となる。
virtual_mailbox_maps用のクエリーはこれまでと異なり、SELECT文を丸ごと記載する方法をとっている。
理由はSELECT結果の表記がちょっと複雑になっているため。

ここまで用意できたら /var/mail の所有権をmain.cfで書いたUIDとGIDに書き換えてPostfixを再起動する。
# chown 10000:10000 /var/mail
# /usr/sbin/postfix reload

後はメールを送ってみて /var/mail の中にスプールディレクトリが出来てメールが保存されていれば成功。

とりあえずメールは送れたので、次は受信できるようにしなければ。

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です