このコードは Andrew McNamara によって作られ、 Xavier Beaudouin によって snapshot 20001121 に適合されました。 これは Wietse によって 20010128 に Postfix の本流にマージされました。 このソフトウェアの目的 ====================== 一つのマシンで扱っている一部もしくは全てのドメインのメールボックス 配送に virtual 配送エージェントを使うことができます。 このメカニズムはそれぞれのバーチャルアドレスを実在のローカル ユーザに変換することで実装されているバーチャルドメインとは異なります。 それをおこなうには、virtual(5) マニュアルページを参照してください。 以下は Andrew McNamara が virtual 配送エージェントを使えるように した時に書いたものです。 「このコードはバーチャルメールホスティングを提供する ISP 向けに デザインされたものです。別々のマップからユーザメールボックスの 場所や uid, gid を検索し、またメールボックスロケーションマップは mailbox, maildir 配送のどちらを指定することもできます (mailbox 名の最後にスラッシュを付けて制御します)。 このエージェントは user+foo 拡張アドレスや aliases、.forward を サポートしない (代わりに virtual テーブルを使って下さい) ので、 ファイルやプログラムエイリアスもサポートしません。この選択により コードは簡単になり、効率良くなりました (これにより local のコードの 70% - ほとんどがセキュリティ対策の細かいもの - の手間を省けました)。 - もしこの機能が必要であれば、このエージェントはあなたには適しません。 また、ルート権限で共通のスプールへ書き込み、メールボックスをユーザに chown することもサポートしません - この機能は私の目的に全面的に 合致しないと思います。」 [End of Andrew McNamara's words] その結果、Postfix に見られる最も安全なローカル配送エージェントに なりました。 この配送エージェントは受信者を(メールボックスのパス、ユーザID、 グループID)として定義するために3つの異なる検索テーブルを必要と します。これは Postfix のテーブル検索が複数の結果を 返すことができないためです。 バーチャルメールボックスが全て同じユーザ/グループID により 所有されているのであれば、単に常に同じ結果を返す「静的な」マップを 指定します。以下の例を参照してください。 バーチャルメールボックスが異なるユーザ/グループID により所有され なければならなかったり、3つの同じようなテーブルが不便で維持できない 場合は LDAP や MYSQL データベースを (もしくは共通のテンプレートから 3つの平行なテーブルを生成して) 利用して下さい。 設定パラメータ ======================== virtual_mailbox_base 全てのメールボックスのパスの前に付けるパス名を指定します。これは バラバラのファイルシステムにメールボックスが分散した、制御不能な マップ(かそれより悪いもの)を確実にするための安全制限です。 "/" を セットすることも可能ですが、推奨しません。 virtual_mailbox_maps 受信者のメールボックスを決めるために、このマップで受信者が検索 されます。返り値のパスがスラッシュ ("/") で終わっていると、 Maildir 形式の配送が行なわれ、そうでなければメールボックス ファイルが指定されたとみなされます。virtual_mailbox_base ディレクトリが無条件にこのパスに付加されます。受信者が 見つからないと、メールはバウンスされます。 受信者が見つからなければ、メールは送信者に返されます。 セキュリティ上の理由で $1 等の置き換えがセキュリティホールを 開けてしまう恐れがあるため、regexp マップは使えません。 メール管理者は受信用 mailbox ファイルもしくは maildir ディレクトリを前もって作成し、chown しておく必要があります。 virtual_minimum_uid virtual_uid_maps 検索から返されたものとして受け入れられる uid の最小値を指定します。返り値がこの値より小さいと拒否され、 メッセージは遅延されます。 virtual_uid_maps 目的のメールボックスに書き込む時に使われる UID (所有者権限) を決定するために、受信者はこのマップから検索されます。 セキュリティ上の理由で $1 等の置き換えがセキュリティホールを 開けてしまう恐れがあるため、regexp マップは使えません。 全てのメールボックスが同じ UID によって所有されるのであれば、 静的マップを指定します。例えば、全てのメールボックスが UID 5000 によって所有されるのであれば、次のように指定します: virtual_uid_maps = static:5000 virtual_gid_maps 目的のメールボックスに書き込む時に使われる GID (グループ権限) を決定するために、受信者はこのマップから検索されます。 セキュリティ上の理由で $1 等の置き換えがセキュリティホールを 開けてしまう恐れがあるため、regexp マップは使えません。 全てのメールボックスが同じ UID によって所有されるのであれば、 静的マップを指定します。例えば、全てのメールボックスが GID 5000 によって所有されるのであれば、次のように指定します: virtual_gid_maps = static:5000 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 は user+foo 拡張アドレスやエイリアスの展開、 .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 に挙げられた全てのドメインが $local_transport # に指定された virtual 配送エージェントを使って配送されます。 mydestination = $myhostname localhost.$mydomain virtual1.domain virtual2.domain 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 配送エージェントはバーチャル 受信者を扱い、全てのバーチャルメールボックスはユーザ ID 5000、 グループ ID 5000 によって所有されます。 システムによっては "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 # ローカル配送エージェントによって配送される全てのドメイン mydestination = $myhostname $localhost.$mydomain # SMTP ポートで知らないローカルおよびバーチャル受信者を拒否する local_recipient_maps = unix:passwd.byname $alias_maps virtual 配送エージェントのエントリがまだなければ定義します。 /etc/postfix/master.cf: virtual unix - n n - - virtual # バーチャルドメインを virtual 配送エージェントに向ける: /etc/postfix/transport: virtual1.domain virtual virtual2.domain virtual # 受信者の例。1人の UNIX スタイル mailbox と 1人の qmail 形式 maildir: /etc/postfix/vmailbox: virtual1.domain required to prevent relay access denied errors virtual2.domain required to prevent relay access denied errors test1@virtual1.domain test1 test2@virtual2.domain test2/ それぞれの 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 それぞれのドメインに 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 宛の 全てのメールを何らかのスクリプトにパイプで渡し、送信者に自動応答を 返すようにして、ローカルでサービスすることもできます。