funini.com 自由研究 postfix-mysql

Postfix + Courier-IMAP + MySQLでバーチャルドメイン

某所で立てているサーバの設定のメモです。 以下の条件で使いたい人には有用かもしれません。 なお、サーバの設定にあたっては先輩の小町さんに大変お世話になりました。 (ていうか手取り足取りでした…ありがとうございます) この文書も、小町さんが書かれた 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

# ドメイン単位でメールを転送させる設定。
# 例えばfoo.com宛てのメールが来たら、mail.bar.comに転送といった風に使う。
# このとき、Fromのアドレスは変換しない。
transport_maps       = mysql:/usr/local/etc/postfix/transport.cf 

# アドレスから保存先ディレクトリを引く設定
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virt.cf 

# ユーザID(数値)。必要なのか分からないが一応。
virtual_uid_maps     = mysql:/usr/local/etc/postfix/uids.cf 

# グループID(数値)。同じく一応。
virtual_gid_maps     = mysql:/usr/local/etc/postfix/gids.cf 

# アドレス単位での転送設定。(kei@fuga.com -> kei@fugafuga.comのような)
virtual_maps         = mysql:/usr/local/etc/postfix/virtual.cf 

# このサーバが目的地となるドメイン。
# この場合はmail.hoge.comとfuga.com, piyo.comとなる
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でドメイン/アカウントのデータベースを作る