このコードは Andrew McNamara によって作られ、 Xavier Beaudouin によって snapshot 20001121 に適合されました。 これは Wietse によって 20010128 に Postfix の本流にマージされました。 このソフトウェアの目的 ====================== 一つのマシンで扱っている一部もしくは全てのドメインのメールボックス 配送にバーチャル配送エージェントを使うことができます。 以下は Andrew McNamara がバーチャル配送エージェントを使えるように した時に書いたものです。 「このコードはバーチャルメールホスティングを提供する ISP 向けに デザインされたものです。別々のマップからユーザメールボックスの 場所や uid, gid を検索し、またメールボックスロケーションマップは mailbox, maildir 配送のどちらを指定することもできます (mailbox 名の最後にスラッシュを付けて制御します)。 このエージェントは aliases や .forward をサポートしません (代わりに virtual テーブルを使って下さい) ので、ファイルやプログラム エイリアスもサポートしません。この選択によりコードは簡単になり、 効率良くなりました (これにより local のコードの 70% - ほとんどが セキュリティ対策の細かいもの - の手間を省けました)。 もしこの機能が必要であれば、このエージェントはあなたには適しません。 また、ルートで共通のスプールへ書き込み、メールボックスをユーザに chown することもサポートしません - この機能は私の目的に全面的に 合致しないと思います。」 [End of Andrew McNamara's words] その結果は Postfix に見られる最も安全なローカル配送エージェントです。 全ての配送は受信者の権限でおこなわれます。 この配送エージェントは受信者を定義するために3つの異なる検索 テーブルを必要とします。これは Postfix のテーブル検索が複数の結果を 返すことができないためです。この制限が修正されるまでは、 3つの同じようなテーブルが不便で維持できない場合は LDAP や MYSQL データベースを (もしくは共通のテンプレートから3つのテーブルを生成して) 利用して下さい。 設定パラメータ ======================== virtual_mailbox_base 全てのメールボックスのパスの前に付けるパス名を指定します。これは バラバラのファイルシステムにメールボックスが分散した、制御不能な マップを保証する(?)(かそれより悪いもの)よりも安全です。 (This is a safety measure to ensure an that out of control map doesn't litter the filesystem with mailboxes (or worse).) "/" を セットすることも可能ですが、推奨しません。 virtual_mailbox_maps 受信者のメールボックスを決めるために、このマップで受信者が検索 されます。返り値のパスがスラッシュ ("/") で終わっていると、 Maildir 形式の配送が行なわれ、そうでなければメールボックス ファイルが指定されたとみなされます。virtual_mailbox_base ディレクトリが無条件にこのパスに付加されます。受信者が 見つからないと、メールはバウンスされます。 受信者が見つからなければ、メールは送信者に返されます。 メール管理者は受信用 mailbox ファイルもしくは maildir ディレクトリを前もって作成し、chown しておく必要があります。 virtual_minimum_uid virtual_uid_maps 検索から返されたものとして受け入れられる uid の最小値を指定します。返り値がこの値より小さいと拒否され、 メッセージは遅延されます。 virtual_uid_maps 目的のメールボックスに書き込む時に使われる UID (所有者権限) を決定するために、受信者はこのマップから検索されます。 virtual_gid_maps 目的のメールボックスに書き込む時に使われる UID (グループ権限) を決定するために、受信者はこのマップから検索されます。 virtual_mailbox_lock この設定は maildir 配送の場合には無視されます。 メールボックスを更新する時に使われるロック方法です。デフォルトは システム依存で、fcntl または flock です。POP や IMAP サーバに よっては、 mailbox ファイルの親ディレクトリに受信者の UID または GID の書き込み権が必要な dotlock を指定する必要があるかも 知れません。 あなたのシステムの Postfix がどのロック方法をサポートしているかを 知るには、"postconf -m" コマンドを使って下さい。 virtual_mailbox_size Mailbox や Maildir ファイルのサイズの上限です。 例 1: 全てのローカルメールに virtual 配送エージェントを使用する =============================================================== この例では Postfix local 配送エージェントは全く使いません。 この設定では Postfix はエイリアスの展開や .forward ファイルの展開、 /etc/passwd の受信者の検索も行ないません。 システム形式に応じて "hash" の代わりに "dbm" や "btree" を指定して 下さい。"postconf -m" コマンドで使用可能な検索テーブル形式を表示します。 /etc/postfix/main.cf: local_transport = virtual virtual_mailbox_base = /var/mail/vhosts virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_minimum_uid = 100 virtual_uid_maps = hash:/etc/postfix/vuid virtual_gid_maps = hash:/etc/postfix/vgid # このマシンが最終配送先となる全てのドメイン mydestination = $myhostname virtual1.domain virtual2.domain # SMTP ポートで知らない受信者を拒否する local_recipient_maps = $virtual_mailbox_maps # エントリがなければ、virtual 配送エージェントを定義する /etc/postfix/master.cf: virtual unix - n n - - virtual # 受信者の例。1人の UNIX スタイル mailbox と 1人の qmail 形式 maildir: /etc/postfix/vmailbox: test1@virtual1.domain test1 test2@virtual2.domain test2/ /etc/postfix/vuid: test1@virtual1.domain 5001 test2@virtual2.domain 5002 /etc/postfix/vgid: test1@virtual1.domain 5001 test2@virtual2.domain 5002 それぞれの mailbox 受信者のために次のようなコマンドを実行します。 # touch /var/mail/vhosts/test1 # chown 5001:5001 /var/mail/vhosts/test1 それぞれの maildir 受信者のために次のようなコマンドを実行します。 # mkdir /var/mail/vhosts/test2 # chown 5002:5002 /var/mail/vhosts/test2 root@$myhostname, postmaster@$myhostname やその他の必要なアドレスに 対応する必要なエントリを忘れないで作るようにしてください。 例 2: デフォルトの local 配送エージェントとの共存 ================================================= この例では、デフォルトの Postfix local 配送エージェントが非バーチャル 受信者へのメールを扱います; virtual 配送エージェントはバーチャル 受信者を扱います。 システムによっては "hash" の代わりに "dbm" や "btree" を指定して 下さい。"postconf -m" コマンドで使用可能な検索テーブル形式を表示 します。 /etc/postfix/main.cf: virtual_mailbox_base = /var/mail/vhosts virtual_mailbox_maps = hash:/etc/postfix/vmailbox virtual_minimum_uid = 100 virtual_uid_maps = hash:/etc/postfix/vuid virtual_gid_maps = hash:/etc/postfix/vgid transport_maps = hash:/etc/postfix/transport # All domains that have final delivery on this machine # このマシンが最終配送先となる全てのドメイン mydestination = $myhostname $localhost.$mydomain virtual1.domain virtual2.domain # SMTP ポートで知らないローカルおよびバーチャル受信者を拒否する local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps # エントリがなければ、virtual 配送エージェントを定義する /etc/postfix/master.cf: virtual unix - n n - - virtual # Route specific domains to the virtual delivery agent; by default, # mail for domains in $mydestination goes to the local delivery agent # 特定のドメインを virtual 配送エージェント経由にする; # デフォルトでは $mydestination に含まれたドメイン宛のメールは # local 配送エージェントに行きます。 /etc/postfix/transport: virtual1.domain virtual virtual2.domain virtual # 受信者の例。1人の UNIX スタイル mailbox と 1人の qmail 形式 maildir: /etc/postfix/vmailbox: test1@virtual1.domain test1 test2@virtual2.domain test2/ /etc/postfix/vuid: test1@virtual1.domain 5001 test2@virtual2.domain 5002 /etc/postfix/vgid: test1@virtual1.domain 5001 test2@virtual2.domain 5002 それぞれの mailbox 受信者のために次のようなコマンドを実行します。 # touch /var/mail/vhosts/test1 # chown 5001:5001 /var/mail/vhosts/test1 それぞれの maildir 受信者のために次のようなコマンドを実行します。 # mkdir /var/mail/vhosts/test2 # chown 5002:5002 /var/mail/vhosts/test2 Remember that each domain is required to have a postmaster contact address. それぞれのドメインに postmaster にコンタクトするためのアドレスを 持つことが必要なことを忘れないで下さい。 例3: 古いアカウント宛のメールを新しいアドレスに転送する ======================================================= 存在しなくなったユーザ宛のメールを転送するために、virtual テーブルで 次のようなルールを設定できます (virtual 設定ファイル内のバーチャル ドメインに関するテキストは無視して下さい): /etc/postfix/main.cf: virtual_maps = hash:/etc/postfix/virtual /etc/postfix/virtual: old_user@old.domain new_user@new.domain 例4: バーチャル vacation 自動応答の設定 ======================================= バーチャル受信者へのメールに自動応答するとともに普通に配送するように 設定するためには、virtual テーブルに次のようなルールを書きます (virtual 設定ファイル内のバーチャルドメインに関するテキストは 無視して下さい): /etc/postfix/main.cf: virtual_maps = hash:/etc/postfix/virtual /etc/postfix/virtual: user@domain.name user@domain.name, user@autoreply.domain.name これは受信者にメールを配送し、またメールのコピーを自動応答を処理する アドレスにも送ります。このアドレスは他のマシンでサービスすることも できますし、transport マップのエントリで autoreply.domain.name 宛の 全てのメールを何らかのスクリプトにパイプで渡し、送信者に自動応答を 返すようにして、ローカルでサービスすることもできます。