Тема: Резервное копирование писем в зависимости от получателя-отправителя

Сразу скажу что это сделано по заказу и четко под определенные требования поэтому воспринимать надо как пример. Основная задача - не потерять письма для конкретных получателей и отправителей. Суть - если письмо отправлено от пользователя и для пользователя то сделать копию.

mparse.php - php - потому что так просили, лучше конечно на perl переписать

#!/usr/bin/php
<?php

error_reporting(0);
require_once('maillist.php');

/*
    Alan Vezhbitskis
    www.alan.lt
*/

$cmd = array();
$logfile = "/etc/postfix/mparse/mparse.log";

if (isset ($argv) and count($argv) > 1)
{
    for ($i=1;$i < count($argv);$i++)
    {
        parse_str($argv[$i],$tmp);
        $cmd = array_merge($cmd,$tmp);
    }
}

$fplog = fopen ($logfile, "a");
function logerror ($txt) {
    global $fplog;
    fwrite ($fplog, date("Y M j G:i:s") . " - ".$txt." \n");
    echo date("Y M j G:i:s") . " - ".$txt." \n";
}

$r=$cmd["--recipient"];
$s=$cmd["--sender"];

$data = '';
while ($input = fread(STDIN, 1024)) {
  $data .= $input;
}

logerror ("Mail from $s to $r");

$rnd = mt_rand (1000,9999);
$tmpfile="/tmp/mparse_tmp.$rnd";

exec ("trap \"/bin/rm -f $tmpfile\" 0 1 2 3 15",$tmp);

$fp = fopen ("$tmpfile", "w");
fwrite ($fp,$data);
fclose ($fp);

exec ("/usr/sbin/sendmail -i $r < $tmpfile",$tmp);
logerror ("Send to $r");

if (array_key_exists ($r,$todu[$s])) {
    exec ("/usr/sbin/sendmail -i ".$todu[$s][$r]." < $tmpfile",$tmp);
    logerror ("Copy to ".$todu[$s][$r]."");
}

exec ("rm -vf $tmpfile",$tmp);

fclose ($fplog);
?>

maillist.php - правила по которым копируем

<?php

$todu = array(

"bill@send1.com"=>array(
    "user1@w.lt"=>"backup.send1@w.lt",
    "user2@w.lt"=>"backup.send1@w.lt"
),

"bill@send2.com"=>array(
    "user5@w.lt"=>"backup.send2@w.lt",
    "user6@w.lt"=>"backup.send2@w.lt"
)

);

?>

Конфигурация postfix

master.cf

...
pickup fifo n - n 60 1 pickup
    -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_milters
...
mparse    unix    -    n    n    -    20    pipe
    flags=Rq user=mail argv=/etc/postfix/mparse/mparse.php --sender=${sender} --recipient=${recipient}
...

main.cf

header_checks = regexp:/etc/postfix/header_checks
nested_header_checks = regexp:/etc/postfix/header_checks_nested

header_checks_nested

# blank

header_checks

/^Received: from.*111\.111\.111\.111.*/i  FILTER mparse:
/^Received: from.*222\.222\.222\.222.*/i  FILTER mparse:

собственно говоря все. Теперь что происходит. При получении письма от 111.111.111.111 (именно для этого и нужны header_checks чтобы не все письма направлять на обработку а только от конкретных серверов) письмо отправляется в mparse.php и скрипту передаются параметры ${sender} и ${recipient}. Письмо сохраняется и отправляется командой "/usr/sbin/sendmail -i" обратно получателю, после чего смотрим нужно ли делать копию и если нужно то копируем.