Postfixでメールを2つのサーバにリレーする

ここで説明すること

前提

example.jpドメインで利用するメールシステムがあります。
インターネットから届いたメールを、メールリレーサーバを経由して、メールボックスに格納します。
ただし、メールボックスが2つあるような状況を想定します。
各サーバのMTAは、Postfixを使用します。

サーバ ホスト名
メール中継サーバ relay.example.jp
メールボックスサーバ1 mail01.example.jp
メールボックスサーバ2 mail02.example.jp

目的

このページで目指すのは以下の2つです。

  • インターネットから届いたメール全てを、2つのメールボックスサーバにリレーしたい(同じメールを2つのサーバに配送したい)
  • インターネットから届いた特定ドメインからのメールだけを、2つのメールボックスサーバにリレーしたい(同じメールを2つのサーバに配送したい)

要はメールを2重配送したい、と言うことです。

制約条件

ただし、以下の様な制約条件とします。

  • 2つのメールボックスサーバに、それぞれユーザが作成されており、それぞれのユーザのメールボックスに配送します。

実装方法

インターネットから届いたメール全てを、2つのメールボックスサーバにリレーしたい場合

この場合は比較的簡単です。
メールボックスサーバ1へは通常通りリレーし、メールボックスサーバ2へはBCCを追加することで配送します。

BCCを追加するためには以下のオプションを使います。

recipient_bcc_maps

recipient_bcc_mapsを使うためには、Toに対するBCCアドレスのテーブルを作成する必要があります。
以下の様な内容で/etc/postfix/recipient_bcc.regexpファイルを作成します。

/(.*)@example.jp/ ${1}@mail02.example.jp

これにより、example.jp宛のメールを受信したら、ローカルパート(ユーザ名)の部分を元に生成したmail02.example.jpのメールアドレスをBCCに付与するようになります。

なお、通常1対1でテーブルを作成する場合はrecipient_bcc.regexpではなく、recipient_bccファイルを作成しpostmapコマンドでハッシュ化しますが、今回は正規表現を用いるためハッシュ化は行いません。

transport_maps

transport_mapsを使うためには、Toに対する配送先メールサーバのテーブルを作成する必要があります。
以下の様な内容で/etc/postfix/transportファイルを作成します。

example.jp smtp:[mail01.example.jp]
mail02.exmaple.jp smtp:[mail02.example.jp]

作成したファイルは以下の様にハッシュ化することで、/etc/postfix/transport.dbファイルが作成されます。

postmap /etc/postfix/transport

上で作成したtransportファイルの意味するところは

  • exmaple.jp宛のメールはメールボックスサーバ1に配送する
  • mail02.example.jp宛のメールはメールボックスサーバ2に配送する

です。

recipient_bcc.regexpファイルに指定したとおり、example.jp宛のメールにはmail02.example.jpのメールアドレスがBCCとして付与されますので、これで2つのメールボックスサーバに配送することが出来ます。

main.cf

recipient_bcc.regexptransportが用意できたところで、最終的に/etc/postfix/main.cfには以下の様に記載します。

transport_maps = hash:/etc/postfix/transport
recipient_bcc_maps = regexp:/etc/postfix/recipient_bcc.regexp

これで完了です。
ちなみにrelayhostを指定すれば、example.jpやmail02.example.jpにマッチしない様なデフォルトの配送先も指定できます。

インターネットから届いた特定ドメインからのメールだけを、2つのメールボックスサーバにリレーしたい場合

通常のメールはメールボックスサーバ1にメールを配送し、特定ドメインからのメールはメールボックスサーバ1とメールボックスサーバ2に配送します。

この場合は私の中では簡単な案が見つからず、力業で実装する形になりました。
Postfixを3インスタンス作成し、特定ドメインからのメールと、それ以外のドメインからのメールで処理するインスタンスを分ける形です。

通常Postfixは複数起動が出来ませんが、複数インスタンスを起動するためのモードがあります。
複数インスタンスの起動については、以下のページが参考になります。

特定ドメインは、ここではexample.co.jpを想定しますが、複数のドメインでも対応出来ます。

postmulti

メインのインスタンスと追加のインスタンス2つの計3インスタンスを動作させますが、追加のインスタンスには名前を付ける必要があるので、今回はstep1、step2と命名します。
以下の様にコマンドを実行します。

postmulti -e init
postmulti -I postfix-step1 -e create
postmulti -I postfix-step2 -e create

initで/etc/postfix/main.cfに複数インスタンスを動作させるための記述が追加されます。
createをすると、/etc/postfix-step1のようなディレクトリが作成され、追加のインスタンスの設定ファイルがその中に格納されます。

postmulti実行後の設定ファイルは以下の様な記述が追加されます。

/etc/postfix/main.cf

multi_instance_wrapper = ${command_directory}/postmulti -p --
multi_instance_enable = yes
multi_instance_directories = /etc/postfix-step1 /etc/postfix-step2

/etc/postfix-step1/main.cf

master_service_disable = inet
multi_instance_name = postfix-step1
multi_instance_enable = yes

今回作成した3つのインスタンスの役割分担です。

インスタンス 用途 Listen IPアドレスとポート
メインインスタンス example.jp宛は、step1へリレー 0.0.0.0:25
step1インスタンス example.jp宛を受信
特定ドメインからのメールは、step2へリレー
127.0.0.1:10025
step2インスタンス example.jp宛&特定ドメインからのメールを受信
特定ドメインからのメールを処理
127.0.0.1:20025

メインインスタンス

メインインスタンスでは、example.jp宛のメールをstep1インスタンスにリレーします。
直接メインインスタンスで処理しない理由は、通常メールリレーサーバは内部からインターネット宛のメールも処理するからです。
メインインスタンスでは、インターネット宛のメールを外部へ配送するのが主目的となりますので、もしその役割が不要であればメインインスタンスと追加インスタンス1つでも事足りるでしょう。

example.jp宛のメールをstep1にリレーするためには、上でも利用したtransport_mapsを使います。
/etc/postfix/transportファイルを以下の内容で作成します。

example.jp smtp:[127.0.0.1]:10025

同様にpostmapコマンドでハッシュ化します。

postmap /etc/postfix/transport

/etc/postfix/main.cfに、transport_mapsを記述します。
また、example.jp宛を別のインスタンスにリレーできるよう、relay_domainsも設定します。
postmlutiコマンドで追加されたものを含めると、以下の様な内容となります。

multi_instance_wrapper = ${command_directory}/postmulti -p --
multi_instance_enable = yes
multi_instance_directories = /etc/postfix-step1 /etc/postfix-step2
relay_domains = example.jp
transport_maps = hash:/etc/postfix/transport

step1インスタンス

step1インスタンスでは、example.jp宛のメールを処理しますが、そのうち特定ドメインからのメールはstep2インスタンスにリレーします。
特定ドメイン宛のメールでは無い場合は、そのままメールボックスサーバ1に配送します。

また、25番ポートは既にメインインスタンスで使われているため、10025番ポートで待ち受けるよう変更します。
ポート番号変更には、/etc/postfix-step1/master.cfを以下の様に修正します。
※smtpから始まる行はコメントアウト、10025から始まる行を追記

#smtp      inet  n       -       n       -       -       smtpd
10025      inet  n       -       n       -       -       smtpd

ドメインによってメールの配送先を変えるためには、以下のオプションを使います。

sender_dependent_relayhost_mapsを使うために、送信元ドメインに対する配送先メールサーバのテーブルを作成する必要があります。
以下の様な内容で/etc/postfix-step1/sender_dependent_relayhostファイルを作成します。

@example.co.jp [127.0.0.1]:20025

このファイルは、postmapコマンドでハッシュ化する必要があります。

postmap /etc/postfix-step1/sender_dependent_relayhost

このファイルの意味するところは

  • 特定ドメインexample.co.jpからのメールは、step2インスタンスに配送する

です。

/etc/postfix-step1/main.cfには、デフォルトの配送先の指定と、上記のsender_dependent_relayhostの設定を追加します。
またTCP/IPの待ち受けが出来るように、master_service_disableから始まる行をコメントアウトします。
postmultiコマンドで追加されたものを含めると、以下の様な内容になります。

#master_service_disable = inet
multi_instance_name = postfix-step1
multi_instance_enable = yes
relayhost = [mail01.example.jp]
sender_dependent_relayhost_maps = hash:/etc/postfix-step1/sender_dependent_relayhost

step2インスタンス

step2インスタンスでは、example.jp宛で特定ドメインからのメールを処理します。
この条件に一致するメールは、メールボックスサーバ1とメールボックスサーバ2に配送します。

step1同様に、/etc/postfix-step2/master.cfを編集し、20025番ポートで待ち受けるように修正をします。

#smtp      inet  n       -       n       -       -       smtpd
20025      inet  n       -       n       -       -       smtpd

全てのメールを2つのメールボックスサーバに配送するのと同様に、recipient_bcc_mapstransport_mapsの2つを使います。

/etc/postfix-step2/recipient_bcc.regexpは、以下の様な内容となります。

/(.*)@example.jp/ ${1}@mail02.example.jp

/etc/postfix-step2/transportは、以下の様な内容となります。

example.jp smtp:[mail01.example.jp]
mail02.exmaple.jp smtp:[mail02.example.jp]

こちらは、postmapコマンドでハッシュ化が必要です。

postmap /etc/postfix-step2/transport

/etc/postfix-step2/main.cfには、上記の2つ、recipient_bcc_mapstransport_mapsの設定を追加します。
step1と同様に、TCP/IPの待ち受けが出来るように、master_service_disableから始まる行をコメントアウトします。
postmultiコマンドで追加されたものを含めると、以下の様な内容になります。

#master_service_disable = inet
multi_instance_name = postfix-step2
multi_instance_enable = yes
recipient_bcc_maps = regexp:/etc/postfix-step2/recipient_bcc.regexp
transport_maps = hash:/etc/postfix-step2/transport

このように3インスタンスで、それぞれ処理するメールを分けることで、ドメインが異なっても複数のメールボックスサーバに配送が出来るようになります。

おすすめ

コメントを残す

Amazon プライム対象