Postfix: メールのコピーをスクリプトに渡し、元のメールはメールボックスに配信する

Postfix: メールのコピーをスクリプトに渡し、元のメールはメールボックスに配信する

実際には非常に簡単です。すべての受信メールを PHP スクリプトに渡したいのですが、コピーとしてのみ渡し、元のメールは通常どおりメールボックスに配信されます。

どうもうまくいかないようです。次のことを試してみました

(1)catchall-alias (mysql) を作成しました:

@mydomain.tld   [email protected]

(2)/etc/postfix/mailpipe.cf に正規表現トランスポート マッピングを作成しました (基本的には、mydomain.tld のすべてのメールに適用することを意味します)

/.*@mydomain\.tld/   mailpipe:

(3)すべてを /etc/postfix/main.cf に統合しました:

transport_maps = ... regexp:/etc/postfix/mailpipe.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/....

(4)/etc/postfix/master.cf にトランスポートを追加しました:

mailpipe   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.php
  ${nexthop} ${user}

スクリプト:

#!/usr/bin/php -q
<?php
  $file = '/home/localuser/pipe/log.log';
  $input = file_get_contents('php://input');
  file_put_contents($file, $input, FILE_APPEND | LOCK_EX);

セットアップは機能しているようですが、スクリプトは受信メールでヒットしますが、 は$input空です (ただし、他の文字列では機能します)。電子メールは処理されてから削除/破棄されます。ここに私の2つの質問があります:

  1. スクリプトから電子メールの内容にアクセスするにはどうすればよいですか?

  2. 処理後に電子メールが破棄されないようにするにはどうすればよいですか? 通常どおり 1 つのコピーを受信トレイに渡し、もう 1 つをスクリプトに渡して処理する方法はありますか?

答え1

これは、recipient_bcc_maps を使用して、スクリプトにルーティングするように構成されたローカル専用アドレスにすべての電子メールを BCC することで実現できます。

/etc/postfix/recipient_bcc に次の行を追加します。編集が完了したら、「postmap /etc/postfix/recipient_bcc」を実行します。これにより、Postfix はドメインが「@yourdomain.tld」に一致するすべての電子メールを「robotscript@localhost」アドレスに BCC 送信するようになります。

@yourdomain.tld  robotscript@localhost

/etc/postfix/transport に次の行を追加します。編集が完了したら、「postmap /etc/postfix/transport」を実行します。これにより、Postfix は、「robotscript@localhost」アドレス宛の電子メールがこのサーバーに直接配信され、他の場所に中継されないことを通知します。

robotscript@localhost :

Postfix が上記で入力した設定を使用するように、/etc/postfix/main.cf に次の行を追加します。

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

/etc/postfix/main.cf の「mydestination」パラメータに「localhost」値が含まれていることを確認します。

/etc/aliases に次の行を追加します。編集が完了したら、「postalias /etc/aliases」を実行します。これは、実際に「robotscript@localhost」宛ての電子メールを PHP スクリプトに渡すものです。スクリプトは、STDIN から電子メールの内容を読み取るように設定する必要があります。

robotscript: "|/path/to/your/php_script.php"

Postfix を再起動すると、すべての電子メールがスクリプトにコピーされ、元の受信者アドレスに配信されるようになります。

関連情報