このドキュメントには 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_README や MYSQL_README、 PGSQL_README といったドキュメントを 参照してください。ネットワークデータベースに移る前にローカルファイルで システムを動くようにして、ネットワークデータベース検索でもローカル ファイル検索と全く同様の結果が得られることを postmap コマンドを 使って確かめることを強く推奨します。
例: postmap -q info@example.com ldap:/etc/postfix/virtual.cf
追加ドメインをホスティングするのに最も簡単なのは、ドメイン名を Postfix mydestination 設定パラメータにリストアップされているドメインに追加して、ユーザ名を UNIX パスワードファイルに追加する方法です。
この方法では、正規ドメインとホスティングドメインに違いは生じません。 それぞれのユーザ名はどのドメインでもメールを受け取れます。
この例では "example.com" をローカル Postfix マシンにホスティング しているドメインとして使います。
/etc/postfix/main.cf: mydestination = $myhostname localhost.$mydomain ... example.com
この方法の制限は:
以下の例では、この2つの制限の解決策を示します。
このセクションに書かれている方法を使うと、 ホスティングドメイン はすべて 独自の 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 ...他のドメイン用のバーチャルエイリアス...
注意:
2行目: virtual_alias_domains 設定で Postfix に example.com がいわゆる バーチャル エイリアスドメインであることを伝えます。この設定を忘れると、Postfix は メールを拒否する (relay access denied) か、配送することができません (mail for example.com loops back to myself)。
バーチャル エイリアスドメイン名を mydestination ドメインには「絶対に」リストアップしないでください。
3-8行目: /etc/postfix/virtual ファイルがバーチャルエイリアスを 持ちます。上の例では、postmaster@example.com 宛のメールはローカルの postmaster へ、info@example.com 宛のメールは UNIX アカウントの joe へ、 ales@example.com 宛のメールは UNIX アカウントの jane へ行きます。 example.com のそれ以外のアドレスは "User unknown" というエラーメッセージで 拒否します。
10行目: コメントアウトされた (# の後の文) はバーチャルエイリアス ファイルでリストアップされていない example.com アドレスをすべて受け取る catch-all バーチャルアドレスを実装する方法を示しています。これにはリスクが ないわけではありません。今、スパマーはメールを考えられるすべての名前から (もしくはすべての名前に) メールを送ろうとしています。catch-all メール ボックスは spam メッセージを大量に受け取ることになり、anything@example.com の名前で送られた spam メッセージのバウンスを大量に受け取ることになる でしょう。
virtual ファイルを変更したら、コマンド "postmap /etc/postfix/virtual" を実行し、main.cf ファイルを変更したら、コマンド "postfix reload" を 実行してください。
注意: バーチャルエイリアスはローカルアドレスにもリモートアドレスにも、 またはその両方ともに解決できます。マシン上の UNIX システムアカウントに 解決する必要はありません。
バーチャルエイリアスファイルに関する詳細は、右側部分に複数のアドレスを 含む場合もあわせて virtual(5) マニュアル ページにあります。
バーチャルエイリアスは問題を1つ解決します: それぞれのドメインで独自の info メールアドレスが持てるようになります。しかしまだ欠点が1つ残っています: バーチャルアドレスはそれぞれ UNIX システムアカウントにエイリアスされます。 バーチャルアドレスを増やすときには、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
注意:
2行目: virtual_mailbox_domains 設定で Postfix に example.com がいわゆる バーチャルメールボックスドメイン であることを伝えます。この設定を忘れると、Postfix はメールを拒否する (relay access denied) か、配送することができません (mail for example.com loops back to myself)。
バーチャル 「メールボックス」ドメイン名を mydestination ドメインには 「絶対に」リストアップしないでください!
バーチャル 「メールボックス」ドメイン名をバーチャル「エイリアス」ドメインには 「絶対に」リストアップしないでください!
3行目: virtual_mailbox_base パラメータには、バーチャルメールボックスのパス名すべての前に付けるパス名を 指定します。これは誰かが間違いを犯した場合の安全機構です。これにより メールがファイルシステム全体には配送されないようになります。
4, 10-15行目: virtual_mailbox_maps パラメータには、バーチャルメールアドレスでインデックス化されたメール ボックス (もしくは maildir) パス名を持つテーブルを指定します。この例では、 info@example.com 宛のメールは /var/mail/vhosts/example.com/info に 行きますが、sales@example.com 宛のメールは /var/mail/vhosts/example.com/sales/ にある maildir に行きます。
5行目: virtual_minimum_uid にはメールボックスまたは maildir 所有者の UID の下限を指定します。これは 誰かが間違いを犯した場合の安全機構です。これによりメールが重要なファイルに 書かれないようにします。
6, 7行目: virtual_uid_maps および virtual_gid_maps パラメータでは、バーチャルメールボックスはすべて固定された uid および gid 5000 が所有するということを指定しています。そうしたくないのであれば、 受信者のメールアドレスで検索される検索テーブルを指定してください。
14行目: コメントアウトされた (# の後の文) はバーチャルエイリアス ファイルでリストアップされていない example.com アドレスをすべて受け取る catch-all バーチャルメールボックスアドレスを実装する方法を示しています。 大量の spam や anything@example.com の名前で送られた spam メッセージの バウンスを受け取る準備をしておいてください。
バーチャル「エイリアス」ファイルにバーチャル「メールボックス」ワイルド カードを「絶対に」置かないでください!!
8, 17, 18行目: 見ての通り、バーチャルエイリアスとバーチャルメール ボックスを混ぜることが可能です。ここでは、example.com の postmaster アドレス宛のメールをローカルの postmaster に向け直すのにこの機能を 使っています。あるアドレスをリモートアドレスに向け直すのにも、同じ メカニズムを使うことができます。
18行目: この例では main.cf で $myorigin が mydestination パラメータ設定に 含まれていると想定しています。そうでない場合は、バーチャルエイリアス テーブルの右側部分のドメイン名に明示的にドメイン名を指定してください。 そうしないとメールは間違ったドメインに行ってしまいます。
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 バーチャル メールボックスの変化型の例です。ここでも、ホスティングしている アドレスは全てそれぞれのメールボックスを持ちます。
非 Postfix ソフトウェアを最終配送に使うとしても、全てを結びつける ためにはやはりいくつかの Postfix の概念が必要です。これを結びつける、 さらなる背景を知るには、ADDRESS_CLASS_README ファイルに書かれている バーチャルメールボックスドメイン クラスを見るとよいでしょう。
このセクションの文章は Postfix の観点から似ているものを記述して います。Cyrus や Courier maildrop についての特定の情報は LMTP_README や MAILDROP_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
注意:
2行目: ホスティングしているドメイン に対して非 Postfix メールボックス保管庫への配送ではたいてい、 virtual_transport パラメータで Postfix LMTP クライアントを指定するか、pipe 配送エージェントを 通して非 Postfix ソフトウェアを実行する master.cf エントリの名前を指定 します。よく使われる例 (どれか1つのみを使います):
virtual_transport = lmtp:unix:/path/name (uses UNIX-domain socket) virtual_transport = lmtp:hostname:port (uses TCP socket) virtual_transport = maildrop: (uses pipe(8) to command)
Postfix では LMTP がサポートされるようになりました。そして maildrop 配送方法はすでにデフォルトの Postfix master.cf ファイルで定義されています。 詳細は MAILDROP_README ドキュメントを 参照してください。
3行目: virtual_mailbox_domains の設定によって、上の段落で議論した virtual_transport を通して example.com に配送するということを Postfix に伝えます。この virtual_mailbox_domains 設定を忘れると、Postfix はメールを拒否する (relay access denied) か、 配送することができません (mail for example.com loops back to myself)。
バーチャル 「メールボックス」ドメイン 名を mydestination ドメインには「絶対に」リストアップしないでください!
バーチャル 「メールボックス」ドメイン名をバーチャル「エイリアス」ドメインには 「絶対に」リストアップしないでください!
4, 7-13行目: virtual_mailbox_maps パラメータは有効な受信者アドレス全てを持つ検索テーブルを指定します。 Postfix は検索結果を無視します。上の例では、info@example.com および sales@example.com が有効なアドレスとしてリストアップされており、それ 以外は全て "User unknown" で拒否されます。ローカルファイルの代わりに LDAP や MySQL、PgSQL を使うつもりであれば、このドキュメントの最初に ある "ローカルファイルとデータベース" セクションを忘れずに再検討してください!
12行目: コメントアウトされたエントリ (# の後の文) は Postfix に catch-all アドレスの存在を伝える方法を示しています。ここでも、Postfix は 検索結果を無視します。
バーチャル「エイリアス」ファイルにバーチャル「メールボックス」ワイルド カードを「絶対に」置かないでください!!
注意: virtual_mailbox_maps でワイルドカードを指定するのであれば、非 Postfix メールボックス保管庫も そのドメインのアドレス全てを受け取るように設定する必要があります。
5, 15, 16行目: 上で見たように、バーチャルエイリアスとバーチャル メールボックスを混ぜることが可能です。ここでは、example.com の postmaster アドレス宛のメールをローカルの postmaster に向け直すのにこの機能を使って います。あるアドレスをリモートアドレスに向け直すのにも、同じメカニズムを 使うことができます。
16行目: この例では main.cf で $myorigin が mydestination パラメータ設定に 含まれていると想定しています。そうでない場合は、バーチャルエイリアス テーブルの右側部分のドメイン名に明示的にドメイン名を指定してください。 そうしないとメールは間違ったドメインに行ってしまいます。
バーチャルファイルを更新したら、コマンド "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 ...他のドメインのバーチャルエイリアス...
注意:
2行目: virtual_alias_domains 設定は Postfix に example.com がいわゆる バーチャル エイリアスドメインであることを伝えます。この設定を忘れると、Postfix は メールを拒否する (relay access denied) か、配送することができません (mail for example.com loops back to myself)。
バーチャル 「メールエイリアス」ドメイン名を mydestination ドメインには 「絶対に」リストアップしないでください!
3-11行目: /etc/postfix/virtual ファイルはバーチャルエイリアスを 持ちます。上の例では、postmaster@example.com 宛のメールはローカルの postmaster に、joe@example.com 宛のメールはリモートアドレスの joe@somewhere に、そして jane@example.com 宛のメールはリモートアドレスの jane@somewhere-else に行きます。example.com のその他全てのアドレス宛の メールは "User unknown" というエラーメッセージで拒否されます。
10行目: コメントアウトされたエントリ (# の後の文) は Postfix に、 バーチャルエイリアスファイルにリストアップされていない全ての example.com アドレス宛のメールを受け取る catch-all バーチャルエイリアスを実装する 方法を示しています。これにはリスクがないわけではありません。今、スパマーは メールを考えられるすべての名前から (もしくはすべての名前に) メールを 送ろうとしています。catch-all メールボックスは spam メッセージを大量に 受け取ることになり、anything@example.com の名前で送られた spam メッセージのバウンスを大量に受け取ることになるでしょう。
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 で $myorigin が mydestination パラメータ設定に リストアップされていると想定します。そうでない場合、バーチャルエイリアス テーブルエントリの右側部分に明示的にドメイン名を指定してください。 そうしないと、メールは間違ったドメインに行ってしまいます。
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 ファイルのコメントを参照してください。