Postfix バーチャルドメインホスティング Howto


このドキュメントの目的

このドキュメントには Postfix バージョン 2.0 以降が必要です。

このドキュメントには、マシン自身を最終配送先としたり、別の配送先に 転送する目的の複数のインターネットドメインのために Postfix を使う方法の 概要があります。

この文章は Postfix に組み込まれた配送メカニズムを記述しているだけ ではなく、非 Postfix メール配送ソフトウェア利用のためのポインタも あります。

以下の話題がカバーされています:

正規ドメイン、ホスティングドメイン、および その他のドメイン

ほとんどの Postfix システムは少数のドメイン名の最終配送先です。 これには Postfix が走っているマシンのホスト名や [IP アドレス] が含まれ、 またホスト名の親ドメインを含むこともあります。このドキュメントの残りの 部分では、これらのドメインを 正規 ドメインと呼びます。たいていは ADDRESS_CLASS_README に 書かれている Postfix ローカル ドメインアドレスクラスで実装されています。

正規ドメイン以外に、 Postfix はいくつでもドメインを最終配送先として設定できます。 直接マシン名に関連してはいないため、これらはホスティングドメインと 呼ばれます。ホスティングドメインは ADDRESS_CLASS_README ファイルに書かれている、バーチャル エイリアスドメインアドレスクラスや バーチャル メールボックスドメインアドレスクラスで実装されます。

ちょっと待って! まだあります。他のドメインのバックアップ MX ホストと して Postfix を設定することもできます。この場合、Postfix はこれらの ドメインの最終配送先ではありません。プライマリ MX ホストがダウン しているときにメールをキューに入れるだけで、プライマリ MX ホストが 復活するとメールを転送します。この機能は ADDRESS_CLASS_README に書かれている、リレー ドメインアドレスクラスで実装されています。

最後に、インターネットにメールを送るための通過ホストとして Postfix を 設定することもできます。明らかに Postfix はそのようなメールの最終配送先 ではありません。この機能は認証されたクライアントやユーザのみが使え、 ADDRESS_CLASS_README ファイルに 書かれているデフォルト ドメインアドレスクラスによって実装されています。

ローカルファイルとネットワーク データベース

この文章の例では DBM や Berkeley DB のようなローカルファイルからの テーブル検索を使います。これらは postmap コマンドを使ってデバッグ するのが簡単です

例: postmap -q info@example.com hash:/etc/postfix/virtual

ローカルファイルをデータベースで置き換える方法は LDAP_READMEMYSQL_READMEPGSQL_README といったドキュメントを 参照してください。ネットワークデータベースに移る前にローカルファイルで システムを動くようにして、ネットワークデータベース検索でもローカル ファイル検索と全く同様の結果が得られることを postmap コマンドを 使って確かめることを強く推奨します。

例: postmap -q info@example.com ldap:/etc/postfix/virtual.cf

できるだけシンプルに: 共有ドメイン、UNIX システム アカウント

追加ドメインをホスティングするのに最も簡単なのは、ドメイン名を Postfix mydestination 設定パラメータにリストアップされているドメインに追加して、ユーザ名を UNIX パスワードファイルに追加する方法です。

この方法では、正規ドメインとホスティングドメインに違いは生じません。 それぞれのユーザ名はどのドメインでもメールを受け取れます。

この例では "example.com" をローカル Postfix マシンにホスティング しているドメインとして使います。

/etc/postfix/main.cf:
    mydestination = $myhostname localhost.$mydomain ... example.com

この方法の制限は:

以下の例では、この2つの制限の解決策を示します。

Postfix バーチャル「エイリアス」の例: 別々のドメイン、UNIX システムアカウント

このセクションに書かれている方法を使うと、 ホスティングドメイン はすべて 独自の info などのEメールアドレスを持つことができます。しかし、依然として ローカルメールボックス配送に UNIX システムアカウントを使います。

バーチャル エイリアスドメインでは、ホスティングしているアドレスはすべて ローカル UNIX システムアカウントやリモートアドレスにエイリアスされます。 以下の例ではこのメカニズムを example.com ドメインに使う方法を示します。

 1 /etc/postfix/main.cf:
 2     virtual_alias_domains = example.com ...他のホスティングドメイン...
 3     virtual_alias_maps = hash:/etc/postfix/virtual
 4 
 5 /etc/postfix/virtual:
 6     postmaster@example.com postmaster
 7     info@example.com       joe
 8     sales@example.com      jane
 9     # catch-all アドレスを実装するには以下のエントリのコメントを外します。
10     # @example.com         jim
11     ...他のドメイン用のバーチャルエイリアス...

注意:

virtual ファイルを変更したら、コマンド "postmap /etc/postfix/virtual" を実行し、main.cf ファイルを変更したら、コマンド "postfix reload" を 実行してください。

注意: バーチャルエイリアスはローカルアドレスにもリモートアドレスにも、 またはその両方ともに解決できます。マシン上の UNIX システムアカウントに 解決する必要はありません。

バーチャルエイリアスファイルに関する詳細は、右側部分に複数のアドレスを 含む場合もあわせて virtual(5) マニュアル ページにあります。

バーチャルエイリアスは問題を1つ解決します: それぞれのドメインで独自の info メールアドレスが持てるようになります。しかしまだ欠点が1つ残っています: バーチャルアドレスはそれぞれ UNIX システムアカウントにエイリアスされます。 バーチャルアドレスを増やすときには、UNIX システムアカウントも増やして いきます。次のセクションではこの問題をなくします。

Postfix バーチャル「メールボックス」の例: 別々のドメイン、非 UNIX システムアカウント

システムがさらに多くのドメインやユーザをホスティングするにつれて、 すべてのユーザに UNIX システムアカウントを与えることは好ましく なくなります。

Postfix virtual(8) メールボックス配送 エージェントを使うと、すべての受信者アドレスにバーチャルメールボックスを 持たせることができます。バーチャルエイリアスドメインとは違い バーチャル メールボックスドメインでは、それぞれの受信者アドレスから別の アドレスへと不格好な変換をする必要がなく、バーチャルメールボックスの 所有者が UNIX システムアカウントを持つ必要もありません。

Postfix virtual(8) メールボックス配送 エージェントはユーザメールボックスのパス名や uid および gid を、別々の テーブルから受信者のメールアドレスで検索します。Maildir 形式の配送は メールボックスのパス名を "/" で終わらせることで有効になります。

複数のテーブル管理が煩わしいと思ったら、情報を (うまく動いた後で) SQL データベースに移行できるということを思い出してください。その方法をとる場合、 このドキュメントの上の方にある "ローカル ファイルとネットワークデータベース" セクションを忘れずに再検討して ください。

バーチャルメールボックスドメイン "example.com" の例を挙げます:

 1 /etc/postfix/main.cf:
 2     virtual_mailbox_domains = example.com ...他のホスティングドメイン...
 3     virtual_mailbox_base = /var/mail/vhosts
 4     virtual_mailbox_maps = hash:/etc/postfix/vmailbox
 5     virtual_minimum_uid = 100
 6     virtual_uid_maps = static:5000
 7     virtual_gid_maps = static:5000
 8     virtual_alias_maps = hash:/etc/postfix/virtual
 9 
10 /etc/postfix/vmailbox:
11     info@example.com    example.com/info
12     sales@example.com   example.com/sales/
13     # catch-all アドレスを実装するには以下のエントリのコメントを外します。
14     # @example.com      example.com/catchall
15     ...他のドメインのバーチャルメールボックス...
16 
17 /etc/postfix/virtual:
18     postmaster@example.com postmaster

注意:

virtual ファイルを編集したらコマンド "postmap /etc/postfix/virtual" を、vmailbox ファイルを更新したら "postmap /etc/postfix/vmailbox" を、そして main.cf ファイルを変更したらコマンド"postfix reload" を実行してください。

注意: メール配送は virtual_uid_maps および virtual_gid_maps で 指定された、受信者の UID/GID 権限でなされます。Postfix 2.0 以前では、 親ディレクトリが world-writable の場合には maildir を作りません; 利用に 先だって作っておかなければいけません。Postfix は親ディレクトリの書き込み 権によっては自分でメールボックスファイルを作ることはできますが、前もって メールボックスファイルを作っておく方が安全です。

バーチャルメールボックス配送エージェントについての詳細は virtual(8) マニュアルページにあります。

Postfix 以外でのメールボックスの保存: 別々のドメイン、非 UNIX アカウント

これは Postfix バーチャル メールボックスの変化型の例です。ここでも、ホスティングしている アドレスは全てそれぞれのメールボックスを持ちます。

非 Postfix ソフトウェアを最終配送に使うとしても、全てを結びつける ためにはやはりいくつかの Postfix の概念が必要です。これを結びつける、 さらなる背景を知るには、ADDRESS_CLASS_README ファイルに書かれている バーチャルメールボックスドメイン クラスを見るとよいでしょう。

このセクションの文章は Postfix の観点から似ているものを記述して います。Cyrus や Courier maildrop についての特定の情報は CYRUS_READMEMAILDROP_README を参照してください。

非 Postfix 配送エージェントに配送する ホスティングドメイン example.com を例に取ります:

 1 /etc/postfix/main.cf:
 2     virtual_transport = ...以下参照...
 3     virtual_mailbox_domains = example.com ...その他のドメイン...
 4     virtual_mailbox_maps = hash:/etc/postfix/vmailbox
 5     virtual_alias_maps = hash:/etc/postfix/virtual
 6 
 7 /etc/postfix/vmailbox:
 8     info@example.com    whatever
 9     sales@example.com   whatever
10     # catch-all アドレスを実装するには以下のエントリのコメントを外します。
11     # 全てのアドレスをこのメールボックスに保管するように設定してください。
12     # @example.com      whatever
13     ...他のドメインのバーチャルメールボックス...
14 
15 /etc/postfix/virtual:
16     postmaster@example.com postmaster

注意:

バーチャルファイルを更新したら、コマンド "postmap /etc/postfix/virtual" を、vmailbox ファイルを変更したら "postmap /etc/postfix/vmailbox" を、そして main.cf ファイルを 更新したらコマンド "postfix reload" を実行してください。

メール転送ドメイン

プロバイダにはローカルメールボックスを持たない (もしくは少数のみ持つ) ドメインをホスティングするものがあります。これらのドメインの主な目的は、 メールを他の場所に転送することです。以下の例ではメール転送ドメインとして example.com を設定する方法を示します:

 1 /etc/postfix/main.cf:
 2     virtual_alias_domains = example.com ...他のホスティングドメイン...
 3     virtual_alias_maps = hash:/etc/postfix/virtual
 4 
 5 /etc/postfix/virtual:
 6     postmaster@example.com postmaster
 7     joe@example.com        joe@somewhere
 8     jane@example.com       jane@somewhere-else
 9     # catch-all アドレスを実装するには以下のエントリのコメントを外します。
10     # @example.com         jim@yet-another-site
11     ...他のドメインのバーチャルエイリアス...

注意:

virtual ファイルを更新したらコマンド "postmap /etc/postfix/virtual" を、main.cf ファイルを更新したらコマンド "postfix reload" を 実行してください。

バーチャルエイリアスファイルについての更なる詳細は、右側部分に複数の アドレスを持つ場合も含めて virtual(5) マニュアルページにあります。

メーリングリスト

上に上げた例ですでにバーチャル postmaster アドレスをローカル postmaster に向ける方法を示しました。あらゆるアドレス宛のメールをローカル またはリモートアドレスに向けるのに同じ方法が使えます。

1つ大きな制限があります: バーチャルエイリアスおよびバーチャルメール ボックスは majordomo のようなメーリングリストマネージャに直接配送する ことができません。これを解決するには、バーチャルアドレスをローカル配送 エージェントに向けるバーチャルエイリアスを設定します:

/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual

/etc/postfix/virtual:
    listname-request@example.com listname-request
    listname@example.com         listname
    owner-listname@example.com   owner-listname

/etc/aliases:
    listname: "|/some/where/majordomo/wrapper ..."
    owner-listname: ...
    listname-request: ...

この例では main.cf で $myoriginmydestination パラメータ設定に リストアップされていると想定します。そうでない場合、バーチャルエイリアス テーブルエントリの右側部分に明示的にドメイン名を指定してください。 そうしないと、メールは間違ったドメインに行ってしまいます。

Postfix ローカル配送エージェントについての更なる情報は local(8) マニュアルページに見つかるでしょう。

なぜこの例ではよりエレガントな transport マッピングを使わずに みっともないバーチャルエイリアスを使うのでしょうか? それはバーチャル メーリングリスト宛のメールが "User unknown" で拒否されてしまうからです。 transport マッピングがうまくいくようにするためには、やはりバーチャル エイリアスやバーチャルメールボックステーブルエントリ群が必要です。

自動応答

バーチャル受信者で通常通りメールを配送しながらの自動応答を設定するには、 バーチャルエイリアステーブルでルールを設定します:

/etc/postfix/main.cf:
    virtual_alias_maps = hash:/etc/postfix/virtual

/etc/postfix/virtual:
    user@domain.tld user@domain.tld, user@domain.tld@autoreply.mydomain.tld

これによりメールは受信者に配送され、さらに自動応答を生成するアドレスに メールのコピーを送ります。そのアドレスは異なるマシンでサービスされても 構いませんし、autoreply.mydomain.tld 宛の全てのメールを送信者に自動応答を送るスクリプトにパイプする transport マップのエントリを設定することで、ローカルでサービスしても構いません。

autoreply.mydomain.tld を mydestination にリストアップ しては「いけません」!

/etc/postfix/main.cf:
    transport_maps = hash:/etc/postfix/transport

/etc/postfix/transport:
    autoreply.mydomain.tld  autoreply:

/etc/postfix/master.cf:
    # =============================================================
    # service type  private unpriv  chroot  wakeup  maxproc command
    #               (yes)   (yes)   (yes)   (never) (100)
    # =============================================================
    autoreply unix  -       n       n       -       -       pipe
        flags= user=nobody argv=/path/to/autoreply $sender $mailbox

これは送信者アドレスと user@domain.tld 受信者アドレスをコマンド ラインに付けて /path/to/autoreply を呼び出します。

更なる情報は、pipe(8) マニュアルページおよび Postfix master.cf ファイルのコメントを参照してください。