今までで説明してきたように、Postfix は mydestination に設定されたドメイン宛のメールを自分が最終目的地であると判断して、ユーザのメールボックスに配送する (またはユーザが存在しない場合は元メールの送信者に対するエラーメールを生成する)。 たとえば、tmtm.org のメールサーバであるマシンで、example.com ドメイン宛のメールも受け取りたければ、mydestination に example.com を追加するだけで良い (当然、DNS の設定等をちゃんと行なって、example.com 宛のメールがそのサーバ宛に送られてくるようにしないといけないが)。
この設定を行うと、tommy@tmtm.org 宛のメールと tommy@example.com 宛のメールが同じ tommy ユーザのメールボックスに格納されることになる。 だが、これでは都合が悪いことがある。tommy@tmtm.org と tommy@example.com が異なるユーザで、同じメールボックスにメールが格納されては困る場合等である。 この場合は、バーチャルドメインの設定を行えば、解決できる。
あるドメインのユーザ宛のメールを別のメールアドレスに送信すれば、上記の問題は解決できる。 たとえば、tommy@example.com 宛のメールを foo@tmtm.org に送ることができれば、tommy@tmtm.org と tommy@example.com は別のメールボックスを持つことができる。 この場合は、「example.com」をバーチャルドメインとして登録する。
バーチャルドメインのリストを指定する。空白または「,」で区切って複数指定可能である。 または、ドメイン名を1個1行で記述したファイルのフルパスを指定しても良い。 さらに、「hash:/etc/postfix/virtual_domain」のような形式で、ルックアップテーブルも指定できる。 この場合は、検索キーとしてドメインが登録されていれば、キーに対する値は何が登録されていても良い。
なお、ここで定義したドメインは mydestination に記述する必要はない。
例:
[/etc/postfix/main.cf] virtual_alias_domains = example.com
virtual_alias_domains で指定したバーチャルドメインに含まれるメールアドレスと、そのメールアドレスを実際に送信する宛先をルックアップテーブル形式で指定する。 これは、名前が示す通り、バーチャルドメイン用のエイリアステーブルなので、通常のエイリアステーブルと同様に、メールアドレスの変換に利用できる。 バーチャルドメインの場合、実ユーザが存在しないため、~/.forward でメール転送を行なうことはできないので、メール転送を行ないたい場合も、この virtual_alias_maps で行う必要がある。
例:
[/etc/postfix/main.cf] virtual_alias_maps = hash:/etc/postfix/virtual [/etc/postfix/virtual] tommy@example.com foo@tmtm.org
このテーブルの左側には、「user@domain」形式以外にも「user」や「@domain」の形式を指定できる。 また、右側には「,」区切りで複数のアドレスを指定できる。 詳細は virtual(5) を参照のこと。
実在のメールアドレスにメールを転送する方法以外に、実在しないユーザ(バーチャルユーザ)用にメールボックスを作成する方法がある。
バーチャルユーザ用のドメインを記述する。空白または「,」で区切って複数指定可能である。 virtual_alias_domains と同様、フルパスやルックアップテーブルも指定できる。
ここで定義したドメインは mydestination に記述する必要はない。
バーチャルユーザのメールアドレスをキーとして、それぞれメールボックスのパス名, UID, GID が返るようなルックアップテーブルを指定する。 virtual_mailbox_maps が返すパス名、virtual_mailbox_base からの相対パスとして、解釈される。 virtual_uid_maps, virtual_gid_maps が返す UID, GID は OS に登録されていないくても構わない。また、異なるメールアドレスに同じ UID を割り当てても構わない。
本来、メールボックス, UID, GID はセットで管理すべきなのだが、Postfix のルックアップテーブルは一つのキーに対して、一つの値しか返せないため、定義が分かれている。 可能であれば、MySQL や PostgreSQL などの RDBMS で管理して、それを Postfix のルックアップテーブルで参照するようにした方が良いだろう。
全メールアドレスに同じ UID や GID を割り当てたい場合は、static ルックアップテーブルが便利だ。次のように記述できる。
[/etc/postfix/main.cf] # 全メールアドレスの UID を 5000 に指定する virtual_uid_maps = static:5000
バーチャルドメインで注意すべき点をいくつか。