LINUX.ORG.RU
ФорумAdmin

Postfix. Вернуть письмо из фильтра в очередь

 


0

2

Есть задача фильтровать каждое входящее письмо в ящике office@xxx.ru.

Создал свой фильтр vacation в master.cf

vacation unix - n n - - pipe
  flags=F user=www-data argv=/etc/postfix/scripts/vacation.php ${sender} ${recipient}

/etc/postfix/scripts/vacation.php - для примера

#!/usr/bin/php
<?php
$file = fopen("/tmp/postfixtest", "a");
fwrite($file, "Script successfully ran at ".date("Y-m-d H:i:s")."\n");
fclose($file);
?>

далее добавил в main.cf

check_recipient_access hash:/etc/postfix/maps/vacation

/etc/postfix/maps/vacation

office@xxx.ru FILTER vacation:dummy

Все работает, в файл /tmp/postfixtest записывается информация. Но при этом письма в office@xxx.ru не доставляются, они уходят в фильтр и от туда не возвращаются( Как сделать, чтобы после того как отработал фильтр письмо возвращалось обратно в очередь Postfix и доставлялось получателю? Как понимаю скрипт должен сам вернуть письмо, но как это лучше сделать? Или может можно сделать, чтобы фильтр срабатывал после доставки письма? В общем нужно анализировать входящее письмо сторонним скриптом без нарушения доставки получателю...



Последнее исправление: musson (всего исправлений: 1)

Вот это вот читали www.linux.org.ru/wiki/en/Postfix#a_.D0.9D.D0.B0.D1.81.D1.82.D1.80.D0.BE.D0.B9... ?

Там всё написано ясно. Фильтр нужно вешать только для smtpd, чтобы почта от локальных процессов, отправляемая с помощью sendmail ставилась в очередь без фильтра. Тогда фильтр получает письмо, записывает его в файл и ставит его в очередь через команду sendmail.

mky ★★★★★
()
Ответ на: комментарий от mky

Читал

Вот так сделал /etc/postfix/scripts/vacation.php - для примера

#!/usr/bin/php
<?php
$file = fopen("/tmp/postfixtest", "a");
fwrite($file, "Script successfully ran at ".date("Y-m-d H:i:s")."\n");
fclose($file);
$content = stream_get_contents(STDIN);

//Here you decide if you want to let the email pass through or not
$pass_through = true;
$sendmail_return_value = 69;

if ($pass_through) {
    unset($argv[0]);
    $sendmail = '/usr/sbin/sendmail -G -i ' . implode(' ', $argv);
    $handle = popen($sendmail, 'w');
    fwrite($handle, $content);
    $sendmail_return_value = pclose($handle);
}

exit($sendmail_return_value);

Работает как надо, пишет в файл /tmp/postfixtest и возвращает письмо обратно в очередь)

musson
() автор топика
Ответ на: Читал от musson

Если нужно смотреть только «метаданные» письма, без тела, то лучше юзать check_policy_service, смотри http://www.postfix.org/SMTPD_POLICY_README.html

Или вообще Milter - там не заморочки с очередями.

blind_oracle ★★★★★
()
Последнее исправление: blind_oracle (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.