[exim4] aliases や Catch-All をドメイン毎に設定

Posted by
ぴろり
Posted at
2017/02/13 20:12
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ
カバーイメージ

 複数のドメイン宛てのメールを、Exim4 MTA が稼働している 1 台のメールサーバでまとめて受けるような運用において、宛先アドレスのドメイン名に応じてエイリアスの設定を変えたり、Catch-All 機能を設定/解除できるようにするための覚書き。exim4 はズブの素人なので、すっごい遠回りしている可能性大。もしかしたら設定 1 つで対応できるのかもしれませんが…

このエントリーをはてなブックマークに追加  

動機

 自宅のメールサーバは Debian GNU/Linux (jessie) 上で Exim4 がほぼ素インストール状態で稼働しています。すると、例えば、example.comexample.orgexample.net、…と複数のドメインの MX レコードをこの 1 台に向けていた場合、bob@example.com 宛てのメールも、bob@example.org 宛てのメールも、bob@example.net 宛てのメールも全て、bob アカウント宛てに届くことになります。ここで、bob@example.com 宛てのメールだけは alice に転送したいと思っても、/etc/aliases では対応できません。なぜなら、bob: alice と書いてしまうと、全ドメインのメールが alice に転送されてしまうからです。

 また、アカウントが存在する/しないに関わらず、ドメイン宛ての全メールを受信する Catch-All という機能があります。これについても、example.com ドメイン宛てのメールは、アカウントが存在する/しないに関わらず全て受信(Catch-All)するが、example.org ドメイン宛てのメールでは、アカウントが存在しなければ User unknown でエラーを返す、といった設定をしたいとします。

設定例 1

 最初に、ドメイン毎の aliases 設定を保存するためのディレクトリを作成しておきます。

$ sudo mkdir /etc/exim4/virtual

 次に /etc/ecim4/exim4.conf.template を修正します。

#domainlist local_domains = MAIN_LOCAL_DOMAINS
domainlist local_domains = MAIN_LOCAL_DOMAINS:dsearch;/etc/exim4/virtual
:
:
### end router/300_exim4-config_real_local 周辺
:
vdom_aliases:
    driver = redirect
    allow_defer
    allow_fail
    domains = dsearch;/etc/exim4/virtual
    data = ${expand:${lookup{$local_part}lsearch*{/etc/exim4/virtual/$domain}}}
    pipe_transport   = address_pipe
    file_transport   = address_file
:
### router/400_exim4-config_system_aliases 周辺

解説とメモ

  • local_domains … 処理の対象となるドメイン名のリストを、/etc/exim4/virtual 以下に置かれている設定ファイルのファイル名一覧から生成します。この修正は必須ではありませんが、新しいドメインが増えた際、/etc/exim4/virtual 以下に、とりあえず空のファイルを置いておくだけで、新しいドメインを受信対象に指定できるので便利です。そうでない場合、/etc/exim4/update-exim4.conf.confdc_other_hostnames に新しいドメイン名を追記した後、都度、update-exim4.conf を実行した上で、サービスの再起動を行わねばなりません。
  • domains/etc/exim4/virtual 以下の置かれた設定ファイルのファイル名一覧から、処理対象となるドメイン名のリストを生成します。ドメイン名と同じファイル名の設定ファイルがない場合にはルールが適用されません。
  • data … 受信したメール アドレスのドメイン名($domain)に対する設定ファイル(/etc/exim4/virtual/$domain)内を検索(lookup)して、元のアカウント名($local_part)に対応する値を取得(lsearch)します。もし、$local_part が見つからなければ、* がないか再検索します*1expand: オペランドが指定されているので、見つかった文字列が再評価されて、:fail::blackhole: といった特殊な項目も正しく処理できるようになっています。

 例として、example.com ドメイン宛てに届いたメールについて、エイリアスの設定や Catch-All 設定を行うには、/etc/exim4/virtual/example.com を作成します。この設定は、example.com ドメイン宛てに届いたメールにのみ適用されます。

bob: alice
tom: :fail: Gone away, no forwarding address.
*: root
  • bob@example.com 宛てのメールを alice 宛てに転送します。
  • tom@example.com 宛てのメールは、メッセージ付きでエラーにします。
  • * の指定があるので、それら以外のメールについて、全て root 宛てに転送します。
  • もし、* の指定がない場合、アカウントごとにメールを配信し、アカウントが存在しないメールにはエラーを返します。

設定例 2

 エイリアスや Catch-All の設定を一つのファイルで行う設定例です。

### end router/300_exim4-config_real_local 周辺
:
vdom_aliases:
    driver = redirect
    allow_defer
    allow_fail
    domains = +local_domains
    data = ${expand:${lookup{$local_part@$domain}lsearch*@{/etc/aliases}}}
    pipe_transport   = address_pipe
    file_transport   = address_file
:
### router/400_exim4-config_system_aliases 周辺

解説とメモ

  • lsearch*lsearch*@ となっている点が違います。まず、検索文字列そのもの(bob@example.com)で検索を行い、見つからなかった場合、次に検索文字列の @ 記号以前を * に置き換えた文字列(*@example.com)で検索を行います。更に見つからなかった場合、* 記号で再度検索します。

 設定ファイルは次の例のようになります。

tom@example.com: jack
*@example.com: :fail:
*: root
  • tom@example.com 宛てに届いたメールのみ、jack 宛てに転送されます。
  • それ以外の example.com ドメイン宛てに届いたメールは、全てエラーになります。
  • それ以外の全ドメイン宛ての全てのメールは root 宛てに転送されます。

開発中のメモ

  • debnug_print の出力はどこで見れるの?⇒ /usr/sbin/exim4 の実行引数に、デバッグレベルを指定する。
  • 設定例 1 において、/etc/exim4/virtual/exmple.com/etc/exim4/virtual/exmple.org が同じ内容でれば、片方の設定ファイルへの symbolic link とすれば、同じ設定を共有できる。
  • エイリアスに :fail: Original Message String とすると、カスタム文字列付きで reason: 550 Original Message String エラー メールを返すことができる。
  • エイリアスに :blackhole: とすると、送信元にエラー メールを返さずに、メールを捨てる。
  • :defer::unknown: というのもあるが、何が起こるのかよく判らなかった。

参考リンク

このエントリーをはてなブックマークに追加  

  1. *1 http://www.exim.org/exim-html-current/doc/html/spec_html/ch-file_and_database_lookups.html#SECTdefaultvaluelookups


関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。