Postfix + Courier-IMAP + MySQLでバーチャルドメイン
某所で立てているサーバの設定のメモです。
以下の条件で使いたい人には有用かもしれません。
- 一つのサーバで複数のドメインを使いたい(バーチャルドメイン)
- ログインアカウントを持たないユーザにPOP/IMAPサービスを提供したい
- 初めに頑張って、ユーザ追加などの管理の手間は減らしたい
なお、サーバの設定にあたっては先輩の小町さんに大変お世話になりました。
(ていうか手取り足取りでした…ありがとうございます)
この文書も、小町さんが書かれた
Postfix + Courier-IMAP で POP before SMTP と IMAP before SMTP
と重複する部分があるので、そちらもご参照下さい。
バーチャルドメインって何?
元々、メールサーバは自分のサーバ名の付いたメールを受け取ります。
例えば、mail.hoge.netというサーバは、kei@mail.hoge.net宛てのメールを
受け取るというのが一番普通の使われ方です。
簡単な設定で、mail.hoge.netがkei@hoge.netとかkei@fuga.net宛ての
メールを受信できるようなります。それは、kei@hoge.netやkei@fuga.netを
サーバ内でkei@mail.hoge.netに読みかえるよう設定すればよいのです。
この場合、どちらのアドレス宛てのメールも"kei"というアカウント
宛てに届きます。これはバーチャルドメインではありません。
これに対し、mail.hoge.netサーバにkei@hoge.net宛てのメールと
kei@fuga.net用のメールを「別のアカウントとして」受け取らせるには
ちょっと工夫が必要です。結果的に言うと、kei@hoge.net宛てのメールは
"kei@hoge.net"というアカウント宛てのメールとして見ればよいのです。
このような設定を「バーチャルドメイン」と言います。
なぜMySQLを使うのか
MySQLを使うのは、ユーザー管理を分かりやすくして、かつアカウントの
追加を楽にするためです。
Postfixの設定は、主にmain.cfというファイルに記述します。
この時、多くの設定は
hoge_domain = hoge.com, fuga.com
のように書くのですが、引数によって値を変えたいもの、例えばアドレスの転送などでは
別のファイルに設定のリストを列記して、このファイルを指定します。
hoge_trasnsfer = hoge_transfer
Postfixでは、設定の記述に列記、static、hash、mysqlといったいくつかの書き方ができます。
設定が増えてくると
ドメインが一つ、アカウントも数個で余り変わらないのなら、
Hashや設定ファイルで対応しても十分だと思います。
postfixのインストール
postfixをMySQL対応でソースからコンパイルします。
FreeBSDの場合はportsでpostfixをmakeします。
すると、オプション選択画面が出るので、ここでMySQLを選択します。インストールが終わると、
プログラム本体、起動用のスクリプト(/etc/init.d/postfix)と設定ファイルの雛型
(/usr/local/etc/postfix/)が出来ます。以下、この設定ファイルを編集します。
MySQLのインストール
これは普通にバイナリで入れてしまってOKです。MySQLサーバとMySQLクライアントの両方が必要です。
MySQLについては
ここも参照。
MySQLでユーザ情報、ドメイン情報のデータベース作成
まずはユーザー情報やドメイン情報を格納するデータベースを作成します。
rootで以下のようなSQL文を流し、データベースを作成します。
CREATE DATABASE maildb;
use maildb;
CREATE TABLE transport (
domain varchar(128) NOT NULL default '',
transport varchar(128) NOT NULL default '',
UNIQUE KEY domain (domain)
) TYPE=MyISAM;
CREATE TABLE users (
id varchar(128) NOT NULL default '',
address varchar(128) NOT NULL default '',
crypt varchar(128) NOT NULL default '',
clear varchar(128) NOT NULL default '',
name varchar(128) NOT NULL default '',
home varchar(128) NOT NULL default '/',
domain varchar(128) NOT NULL default '',
maildir varchar(255) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY id (id),
UNIQUE KEY address (address),
) TYPE=MyISAM;
CREATE TABLE virtual (
address varchar(255) NOT NULL default '',
goto varchar(255) NOT NULL default '',
UNIQUE KEY address (address)
) TYPE=MyISAM;
作成終了後、
Postfixでバーチャルドメインの設定
次にこのデータベースをPostfixが参照できるように設定します。
ここで編集するファイルは、FreeBSDなら/usr/local/etc/postfix以下、VineやRedhatなら
/etc/postfixにあるmain.cfです。
ここでは、大事そうな部分のみを抜粋しておきます。
myhostname = mail.hoge.com
virtual_mailbox_domains = fuga.com piyo.com
transport_maps = mysql:/usr/local/etc/postfix/transport.cf
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virt.cf
virtual_uid_maps = mysql:/usr/local/etc/postfix/uids.cf
virtual_gid_maps = mysql:/usr/local/etc/postfix/gids.cf
virtual_maps = mysql:/usr/local/etc/postfix/virtual.cf
mydestination = $myhostname, $virtual_mailbox_domains, $transport_maps
relay_domains = $mydestination, $virtual_alias_domains
home_mailbox = Maildir/
virtual_mailbox_base = /var/spool
mail_spool_directory = /var/spool/mail
MySQLでドメイン/アカウントのデータベースを作る