実際には非常に簡単です。すべての受信メールを 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 つのコピーを受信トレイに渡し、もう 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 を再起動すると、すべての電子メールがスクリプトにコピーされ、元の受信者アドレスに配信されるようになります。