Postfix: передать копию электронного письма скрипту, но доставить оригинал в почтовый ящик

Postfix: передать копию электронного письма скрипту, но доставить оригинал в почтовый ящик

На самом деле все довольно просто: я хочу передавать все входящие письма в PHP-скрипт, но только как копии, исходное письмо по-прежнему будет доставляться в почтовый ящик, как обычно.

Я просто не могу заставить это работать. Я пробовал следующее

(1)Создал универсальный псевдоним (mysql):

@mydomain.tld   [email protected]

(2)Создал сопоставление regex-transport в /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пуст (работает с любой другой строкой). Письмо обрабатывается, а затем удаляется/отбрасывается.Итак, вот мои два вопроса:

  1. Как я могу получить доступ к содержимому письма из скрипта?

  2. Как предотвратить удаление письма после обработки? Есть ли способ передать одну копию в папку «Входящие», как обычно, а другую — в скрипт для обработки?

решение1

Это можно сделать, используя receive_bcc_maps для отправки скрытых копий всех писем на локальный адрес, настроенный для маршрутизации на ваш скрипт.

Добавьте следующую строку в /etc/postfix/recipient_bcc. Запустите "postmap /etc/postfix/recipient_bcc" после завершения редактирования. Это сообщит Postfix о необходимости отправлять BCC всех писем, где домен соответствует "@yourdomain.tld" на адрес "robotscript@localhost".

@yourdomain.tld  robotscript@localhost

Добавьте следующую строку в /etc/postfix/transport. Запустите "postmap /etc/postfix/transport" после завершения редактирования. Это сообщит Postfix, что письма, предназначенные для адреса "robotscript@localhost", должны доставляться непосредственно на этот сервер, а не ретранслироваться куда-либо еще.

robotscript@localhost :

Добавьте следующие строки в /etc/postfix/main.cf, чтобы Postfix использовал введенные выше конфигурации.

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

Убедитесь, что параметр «mydestination» в /etc/postfix/main.cf включает значение «localhost».

Добавьте следующую строку в /etc/aliases. Запустите "postalias /etc/aliases" после завершения редактирования. Это то, что фактически передает письма, предназначенные для "robotscript@localhost", в ваш PHP-скрипт. Ваш скрипт должен быть настроен на чтение содержимого письма из STDIN.

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

Перезапустите Postfix, и все ваши письма будут скопированы в ваш скрипт, а также доставлены на исходный адрес получателя.

Связанный контент