2009年12月25日金曜日

postfixでVirtualアカウントの管理をMySQLで

どうも、俺@仕事中です。
今日はPostfix(2.5.5)のvirtual_mailbox_mapsについてです。
しかもそれをMySQLで管理しちゃおう!という話です。

そもそもvirtual_mailbox_mapsというのは、簡単に説明するとその名の通り
そのサーバのアカウントにないアカウント(仮想アカウント)のメールをメールボックスに保存するというものです。
今回はMySQLを利用しますので、postfix-2.5.5ソースをDLして、まず
# tar zxvf postfix-2.5.5.tar.gz
# cd postfix-2.5.5
# make makefiles AUXLIBS='-L/usr/local/lib -L/usr/local/mysql/lib/mysql -lssl -lcrypto -lmysqlclient -lz -lm' CCARGS='-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_TLS -I/usr/local/include -DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\"'
(パスは環境に合わせてね)のコマンドを打ちます。
ここでlibmysqlclient.soが見つからないぜ!的なエラーが出る場合は、
-L/usr/local/mysql/lib/mysqlのパスが正しいかどうか確認し、それも合っている場合は、
# vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib/mysql
を追加(パスは適宜合わせてね)。で、
# ldconfig -v
# make upgrade
でもう一度 make makefiles を打ちます。次に、
# make && make install(全てEnter)
でインストール完了です。
次に、main.cfの編集です。
# vim /etc/postfix/main.cf
fallback_transport = virtual # ローカルに存在しないアカウント宛の処理
virtual_mailbox_base = /usr/local/virtual # 適宜あわせてね
virtual_mailbox_maps = /etc/postfix/virtual_mailbox_mysql
virtual_uid_maps = static:10000
virtual_gid_maps = static:1000
を追加します。

続いてグループ、ユーザの作成。
# groupadd -g 10000 vgroup
# useradd -u 10000 -g vgroup -d /usr/local/virtual -s /sbin/nologin vuser


次は、virtual_mailbox_mysqlの設定。
# vim /etc/postfix/virtual_mailbox_mysql
hosts = localhost
dbname = mailsystem
user = mysql_user
query = SELECT concat(name,'/') FROM mail_account WHERE active=1 AND domain='%d' AND name='%u'

で、これをhash化します。
# postmap /etc/postfix/virtual_maibox_mysql


続いてMySQLの構築。今回はMySQLは自サーバで稼動しているものとします。
# mysql -h localhost
mysql> create database mailsystem;
mysql> create table mail_account (
id int not null auto_increment,
name varchar(128) not null default '', # virtual_accountの名前
password varchar(128) not null default '', # virtual_accountのPass
domain varchar(128) not null default '', # サーバドメイン
active tinyint(1) not null default 0, # 利用する/しないのフラグ
primary key (id)
);

INSERT INTO mail_account (name, password,domain,active) values ('username','password','mydomain.jp',1);
テーブル操作権限等は適宜指定してください。

では、postfix起動します。
# /usr/sbin/postfix start

これで、MySQLに入れたアカウント宛のメールであれば、/usr/local/virtual以下へ配送されます。

ちなみに、配送の確認をするには
# postmap -a "username@mydomain.jp" mysql:/etc/postfix/virtual_mailbox_mysql

とやって、対象の結果(今回で言うと username/)が返って来ればOKです。
何も表示されない場合は、何か間違えてます。

めでたし、めでたし!お(・∀・)め(・∀・)で(・∀・)と(・∀・)う!

0 件のコメント: