ブログ

PostfixAdmin利用時におけるメール受信時の処理起動
2020.10.21

PostfixAdminで管理されたバーチャルユーザーのメールを受信した際に、プログラムを起動して標準入力からメールの内容を受信する手順についてです。

ネット上で新しい日付の情報になかなか巡り合わなかったこともあり、記事にしたいと思います。

PostfixAdminの転送設定と編集ページの操作で、思わぬ落とし穴も分かりましたのでお伝えします。

目次

  1. サーバー環境
  2. Postfixの設定変更
  3. 設定の反映
  4. PostfixAdminでの設定と注意点

1.サーバー環境

次のようなサーバー環境を構築しました。
今回は、perlプログラムを起動する案件での話ですが、PHPなど他の言語でも同様に対応できると思います。

  • CentOS 7.8
  • Apache 2.4.6
  • Postfix 2.10.1
  • dovecot 2.2.36
  • MySQL 5.5.65(MariaDB)
  • PostfixAdmin 3.2
  • Perl 5.16.3
  • 標準入力からデータを取得するperlプログラム

2.Postfixの設定変更

(1) /etc/postfix/main.cfファイルの修正

次のように修正して、/etc/postfix/virtualファイルで指定のメールアドレスを転送できるように設定し、/etc/postfix/transportで指定のグループへ転送できるように指定します。

修正前

virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf

修正後

virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf,regexp:/etc/postfix/virtual
transport_maps = regexp:/etc/postfix/transport

「virtual_alias_maps」には、半角カンマで区切って追記します。
「ransport_maps」は別の行に追記します。

(2) /etc/postfix/virtualファイルへの追記

次に、すでに存在していた(コメントのみですが)ファイルへ、以下を追記します。

ここでは、あらかじめPostfixAdminで登録した「sample-2020@e-pokke.com」というメールアドレスを例に、このメールアドレスで受信した内容をプログラムが受け取るケースとして示します。

追記内容

/^sample-2020\@e-pokke\.com$/ sample-2020@e-pokke.com

正規表現の部分では、「@」とピリオドをエスケープしておきます。
正規表現で一定のルールを記述すれば、複数のメールアドレスの受信にも対応できます。

プログラムにメール内容を渡すと同時に、他のメールアドレスにも転送する場合には、半角カンマ区切りで記述します。

記述例

/^sample-2020\@e-pokke\.com$/ sample-2020@e-pokke.com, info@e-pokke.com, support@e-pokke.com

(3) /etc/postfix/transportファイルへの追記

次に、すでに存在していた(コメントのみですが)ファイルへ、以下を追記します。

条件にマッチするメールアドレスを指定した「グループ」に転送して処理します。

以下の例では、グループ名として「sample2020」を指定しています。

追記内容

/^sample-2020\@e-pokke\.com/ sample2020

正規表現の部分では、「@」とピリオドをエスケープしておきます。
正規表現で一定のルールを記述すれば、複数のメールアドレスの受信にも対応できます。

ここでの注意事項は、「グループ名」として半角ハイフンやアンダースコアを含めないということです(どちらかが問題になるのか、グループ名をクオーテーションで囲むなどの対策ができるかなど詳しいことは調べていません。スミマセン)。

(4) /etc/posftix/master.cfファイルの修正

上記(3)で指定したグループ「sample2020」に対する設定を追記します。

以下の例では、実行ユーザーとして「hogehoge」にて、実行するperlプログラム
/usr/bin/perl /home/hogehoge/bin/sample_program.pl
を指定しています。

sample2020 unix - n n - - pipe flags= user=hogehoge argv=/usr/bin/perl /home/hogehoge/bin/sample_program.pl

3.設定の反映

以下を実行して、Postfixの設定を反映します。

postmap ./virtual
postmap ./transport
systemctl restart postfix

4.PostfixAdminでの設定と注意点

上記 2.(2) ですでにメールアドレスを登録しているはずですので、「メールアドレス一覧」ページを開き、「転送元」リンクから進みます。

「転送元」の設定ページでは次のように設定します。

ここでポイントは3つあります。

  • 転送先のメールアドレスを適当に入力する(何かを入力しないと「変更を保存」できないためです。後述する設定ミスの状態だと転送されるので、それに気づくためにも実在するメールアドレスがよいと思います)
  • 「ローカルのメールボックスに残す」のチェックを外す
  • 「アクティブ」のチェックを外す

「アクティブ」のチェックを外しているので、メールアドレスが入力されていても、そちらへ転送されることはありません。
逆に、チェックがついていると単純に転送されてしまい、プログラムが起動されません。

今回、とてもハマってしまった重要ポイントは次の点です。

「転送元」を編集した後で、「編集」リンクから更新を行った場合、「転送元」ページの「アクティブ」欄にも自動的にチェックがついてしまいます。
更新後は、「転送元」の「アクティブ」のチェックを外し忘れないようご注意ください。

以上の設定が完了後、「sample-2020@e-pokke.com」にメールを送信すると、プログラムがメール内容を読み取れるようになります。

以上、お役に立てれば幸いです。

参考サイト
Amazon EC2 (Amazon Linux) のpostfixadmin環境下で空メール受信処理をする
http://blog.genies.jp/2012/04/amazon-ec2-amazon-linux-postfixadmin.html