На самом деле это довольно просто: я хочу передать все входящие электронные письма в PHP-скрипт, но только в виде копии, исходное электронное письмо все равно будет доставлено в почтовый ящик, как обычно.
Я просто не могу заставить его работать. Я пробовал следующее
(1) Создан общий псевдоним (mysql):
@mydomain.tld pipe@mydomain.tld
(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 вопроса:
Как мне получить доступ к содержимому электронного письма из скрипта?
Как я могу предотвратить удаление электронного письма после обработки? Есть ли способ передать одну копию в почтовый ящик как обычно, а другую - в скрипт для обработки?
Этого можно добиться, используя recipient_bcc_maps для BCC всех писем на локальный адрес, настроенный для маршрутизации к вашему сценарию.
Добавьте следующую строку в / etc / postfix / recipient_bcc. После редактирования запустите "postmap / etc / postfix / recipient_bcc". Это сообщает Postfix BCC обо всех электронных письмах, в которых домен совпадает с адресом «robotscript @ localhost» в домене @ yourdomain.tld.
@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, и все ваши электронные письма должны быть скопированы в ваш скрипт, а также доставлены на исходный адрес получателя.