Тема: Резервное копирование писем в зависимости от получателя-отправителя
Сразу скажу что это сделано по заказу и четко под определенные требования поэтому воспринимать надо как пример. Основная задача - не потерять письма для конкретных получателей и отправителей. Суть - если письмо отправлено от пользователя и для пользователя то сделать копию.
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(
"[email protected]"=>array(
"[email protected]"=>"[email protected]",
"[email protected]"=>"[email protected]"
),
"[email protected]"=>array(
"[email protected]"=>"[email protected]",
"[email protected]"=>"[email protected]"
)
);
?>
Конфигурация 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" обратно получателю, после чего смотрим нужно ли делать копию и если нужно то копируем.