postfix logo Postfixのぺーじ
− Postfixでの正規表現のススメ
更新: 2005年2月19日  


ホームオリジナルドキュメント >Postfixでの正規表現のススメ


注意: このページの記述は私がよくわかって ない部分をかなり含んでいます。特に全てのユーザ名を表す正規表現は 正確でないかもしれません。実際にこのページをみて正規表現を利用する 際には、洩れるアドレスはないか、余分なアドレスがマッチしないか 十分に確認してから実際に利用して下さい。

また、何かお気づきの点がありましたら までお知らせ下さい。 便利な正規表現の使い方もお待ちしています。


Postfix で様々な条件が絡んだ細かい設定を必要とするとき、正規表現を 使った設定が役に立つかもしれません。特に sendmail で使ってきた設定を Postfix に持ち込むには、正規表現による制御が必要になるでしょう。

しかし、通常の db/dbm などのマップと異なり、アクセスの負荷が大きいため、 流量の多いサイトでこれを使うと問題が起こるかも知れません。しばらくは トラブルを避けるためにもログなどの監視が必須です。

Postfix では POSIX 互換正規表現と PCRE (PERL-compatible regular expression) をサポートしていますが (regexp は 19990316版以降、PCRE は 19990307 版以降)、 一部のシステムでは POSIX 互換正規表現は使えません。 BSD 系や Linux などではデフォルトで POSIX 互換の正規表現が 使えるようになっていますが、一部のシステムではこれが使えません。


正規表現とは?
正規表現とは、簡単にいうと、ある文字列の中から特定のパターンを 探し、見つかった場合にはそれに対してなんらかの処理をすることを 指します。これを使うと、abc で始まるメールアドレスとか、 途中に xyz を含むドメイン名を探して、そのメールを 受け入れないようにしたり、ある特定のユーザに転送したりすることが できます。


正規表現を使う前に

デフォルトでは *BSD、Linux、HP-UX などでは regexp が組み込まれますが、 PCRE はどのシステムでもデフォルトでは組み込まれないので、 コンパイル時に PCRE ライブラリをリンクする必要があります。

PCRE を Postfix で使うには、まず Postfix のダウンロードサイトから PCRE version 2.08 を取得します。これを Postfix のソースアーカイブと同じディレクトリに置き、 両方とも展開します。

    % tar xvzf pcre-2.08.tar.gz
    % tar xvzf postfix-19991231-pl09.tar.gz

先に PCRE のライブラリを構築します。

    % cd pcre-2.08
    % vi Makefile
        (AR, CC, CFLAGS, RANLIB をシステムに合わせて設定します。
         インストールまでするのであれば、BINDIR, INCDIR, LIBDIR, MANDIR
         も設定します。)
    % make
    % cd ../

次に Postfix の構築です。PCRE のライブラリをリンクするように Makefile を作ってコンパイルします。

    % cd release-20010228
    % make tidy
        (以前に make したことがあれば必須です)
    % make -f Makefile.init makefiles 'CCARGS=-DHAS_PCRE \
        -I../../../pcre-2.08' 'AUXLIBS=../../../pcre-2.08/libpcre.a'

    (19991231 版など、ソースが src 以下にないものは次のようにします:
      % make -f Makefile.init makefiles 'CCARGS=-DHAS_PCRE \
        -I../../pcre-2.08' 'AUXLIBS=../../pcre-2.08/libpcre.a')

    % make

あとは通常のインストールアップデートの手順と同じです。

インストールされた Postfix が regexp や PCRE を使えるかを チェックするには、

    % postconf -m

コマンドを使います。


Postfix 正規表現の文法

正規表現の基本文法は Riueちゃんの正規表現講座 などをみて下さい。

Postfix で正規表現を使う場合には、

    正規表現   返すテキスト

の形式である必要があり、 $myhostname などの変数をセットしたり使うことは出来ません。 変数としてセットできるのは ( ) で囲んだ部分だけです ((?!...) などは除く)。これは前から順に $1$2... のようになり、 2つめのフィールドで使うことが出来ます。
また、アドレスやホスト・ドメイン名、ヘッダなどをマッチさせる場合には、 /^...$/ のように最初と最後を必ず指定するようにしましょう。 これがないと思わぬものがマッチしてしまう可能性があります。


正規表現のチェック

正規表現によるマップを作ったら、それをテストしてみましょう。
Postfix にはマップのチェック用プログラムがあり、これを使って 実際に特定の処理を行ないたい文字列を正規表現にマッチするかチェック できます(このプログラムは db など他のマップにも使えます)。

チェック用プログラムは次のように作成します。まず、Postfix のコンパイル 直後 (PCRE ライブラリをチェックする場合には PCRE 付きでコンパイルした 直後) に Postfix のトップディレクトリに行き、そこで、

    % cd util
    % make dict_open

とします。アーカイブ展開直後や make tidyMakefile を消してしまった場合には、トップディレクトリで

    % make makefiles
    (PCRE 使用の場合は
    % make -f  Makefile.init makefiles 'CCARGS=-DHAS_PCRE -I../../pcre-2.08' \
        'AUXLIBS=../../pcre-2.08/libpcre.a')

とした後で上の make dict_open を実行します。

チェックのしかたはマップファイルを用意して、

   % ./dict_open maptype:/etc/postfix/mapfile read

としてマップを読み込ませて、あとはマッチするかチェックしたい文字列 (例えばメールアドレスやホスト名、ヘッダなど)を入力します。 標準入力から読み込むので、単に上のコマンドを実行した場合には、 終了時に ^D (or ^C) を使って抜ける必要があります。


正規表現の使用例



ike@kobitosan.net