[自分用メモ] postfixのエイリアス設定で正規表現を使う設定をしてみた

他部署の担当から、使い捨て用のメールアドレスの設定が欲しい、ついてはtest000~test999までの1,000アドレスを頂きたい、という旨の依頼を受けた。

まあそれ自体は技術的にも問題はないし、設定自体もたかが知れている。1,000行分の設定も、Windows慣れしている人ならExcel使えばコピーで処理できるし、そうでなくても以下のようにすれば1,000行分の設定など造作もないだろう。

[c]
#include <stdio.h>
main()
{
int i;

for (i = 0; i < 1000; i++)
printf("test%03d@example.jp\t\ttest@example.co.jp\n", i);
}
[/c]

これをコンパイルして実行すればいいだけだ。

[text]
# cc a.c
# ./a.out > aliases.list
[/text]


しかし1,000行を設定することに無駄というか不合理さを感じるのが私の悪い(?)クセであって、たとえば999まで使った後に「1000~1999を追加して」とか言われるのはとてもメンドクサイ。他のエンジニアが作業できるよう(あるいは忘れないよう)にするためにドキュメントを書いておくのもなんだかアホくさいじゃないか。

postfixなら正規表現ぐらい使えるだろうと思って調べてみたら、案の定alias_mapsで指定ができることを確認した。
ということで、正規表現を使って対応することにした。

まず、/etc/postfix/main.cfファイルの「alias_maps」に、「regexp:/etc/postfix/aliases.regexp」のように正規表現を記載したaliasesファイルを指定する。ファイルのパスはどこでもいいが、フルパスで指定しておくこと。/etc/aliases.regexpなどでもいい。またファイル名も「aliases.regexp」にこだわる必要はない。

[text]
alias_maps = hash:/etc/aliases, regexp:/etc/postfix/aliases.regexp
[/text]

次に、/etc/postfix/aliases.regexpファイルを用意する。mapの書き方は/etc/aliasesファイルと同じである。左側に正規表現があればいいというだけだ。

[text]
/^test[0-9]+(@example\.jp)?$/ test@example.co.jp
[/text]

ところで1つハマッたポイントがある。
最初、正規表現を私は以下のように書いていた。

[text]
/^test[0-9]+@example\.jp$/ test@example.co.jp
[/text]

しかし、/var/log/maillogで配送確認をしてもbouncedになってしまうのだ。

[text]
Feb 4 17:02:47 myserver postfix/local[30572]: 9B64B2536F: to=<test000@example.co.jp>, relay=local, delay=0.18, delays=0.13/0.01/0/0.04, dsn=5.1.1, status=bounced (unknown user: "test000")
[/text]

local(8)の処理でひっかかっているようだ。
いくつか調べてみたら、postfix-jpメーリングリストにビンゴの回答がされているのを見つけた。

■[postfix-jp: 2247] Re: alias_maps の regexp 指定について
http://www.postfix-jp.info/ML/arc-2.3/msg00246.html

ここでまさに回答者が、local_recipient_mapsでの検索時はドメイン付きで行われるが、local(8)がalias_mapsを評価する際にはユーザパートのみで行うと書いている。なるほどね……。ローカルへの配送だからドメイン名を無視している、ということなのか。

なおman 8 localに記載されているが、正規表現においてもセキュリティ上の問題から$1、$2などは使用できないなどの制限もあるようだ。

なので、正しい記載は以下のように「ドメインパートが含まれるか含まれないか」という記述「(@example\.jp)?」が必要になる。

[text]
/^test[0-9]+(@example\.jp)?$/
[/text]

まあ、以下のように2行書いてもいいのかもしれないけれど、これだと正規表現の価値が下がるので、やはり1行で指定したほうがいいだろう。

[text]
/^test[0-9]+@example\.jp$/
/^test[0-9]+$/
[/text]

記述した後は設定ファイルのリロードが必要になる。aliases.regexpファイルの追加や修正をした場合も、hashファイルではないのでリロードが必要だ。

[text]
# postfix reload
[/text]

CentOSなど、serviceコマンドがあるLinux系OSであれば、以下のようにリロードもできる。

[text]
# service postfix reload
[/text]

Postfix実践入門 (Essential Software Guide Book)Postfix実用ガイド同報@メール5 /R.2 通常版改訂新版 28日で即戦力! サーバ技術者養成講座豊肥椎茸 【大分県産 椎茸】 徳用 100g特選フランス紅白ワイン2本セット 化粧箱入【 フランス産・赤ワイン・白ワイン・辛口・750ml×2】

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください