backoffice/html/mailing/admin/generatebouncerules.php

144 lines
4.7 KiB
PHP
Raw Permalink Normal View History

2011-06-21 15:28:10 +02:00
<?php
require_once dirname(__FILE__).'/accesscheck.php';
print '<script language="Javascript" src="js/progressbar.js" type="text/javascript"></script>';
flush();
#$limit = '';
$numperrun = 10000;
ob_end_flush();
$count = 0;
$notmatched = 0;
$existmatch = 0;
$rules = array();
function output($message) {
print $message . "<br/>\n";
flush();
}
print '<script language="Javascript" type="text/javascript"> yposition = 10;document.write(progressmeter); start();</script>';
# lets not do this unless we do some locking first
$abort = ignore_user_abort(1);
$process_id = getPageLock();
$req = Sql_Fetch_Row_query(sprintf('select count(*) from %s ',$GLOBALS['tables']['bounce']));
$total = $req[0];
if (isset($_GET['s'])) {
$s = sprintf('%d',$_GET['s']);
$e = $s + $numperrun;
} else {
$s = 0;
$e = $numperrun;
}
$limit = ' limit '.$s.', '.$numperrun;
if ($total > $numperrun && $e < $total) {
$next = '<p>'.PageLink2('generatebouncerules&s='.$e,$GLOBALS['I18N']->get('Process Next Batch')).'</p>';
} else {
$next = '';
}
$req = Sql_query(sprintf('select * from %s %s ',$GLOBALS['tables']['bounce'],$limit));
while ($row = sql_Fetch_array($req)) {
$alive = checkLock($process_id);
if ($alive)
keepLock($process_id);
else {
print $GLOBALS['I18N']->get("Process Killed by other process");
exit;
}
$count++;
if ($count % 10 == 0) {
print '. '."\n";flush();
if ($count > 1000000) {
return;
}
}
$regexid = matchedBounceRule($row['data']);
if ($regexid) {
Sql_Query(sprintf('insert into %s (regex,bounce) values(%d,%d)',
$GLOBALS['tables']['bounceregex_bounce'],$regexid,$row['id']),1);
$bouncematched = 1;
$existmatch++;
} else {
$lines = explode("\n",$row['data']);
# print '<br/>'.sizeof($lines).' lines';
$bouncematched = 0;
set_time_limit(100);
foreach ($lines as $line) {
if (preg_match('/ (55\d) (.*)/',$line,$regs)) {
$bouncematched = 1;
$code = $regs[1];
$info = $regs[2];
#if ($code != 550) {
# print "<br/>$line";
# print "<br/><b>$code</b>";
# print htmlspecialchars(" $info");
$rule = preg_replace('/[^\s\<]+@[^\s\>]+/','.*',$info);
$rule = preg_replace('/\{.*\}/U','.*',$rule);
$rule = preg_replace('/\(.*\)/U','.*',$rule);
$rule = preg_replace('/\<.*\>/U','.*',$rule);
$rule = preg_replace('/\[.*\]/U','.*',$rule);
$rule = str_replace('?','.',$rule);
$rule = str_replace('/','.',$rule);
$rule = str_replace('"','.',$rule);
$rule = str_replace('(','.',$rule);
$rule = str_replace(')','.',$rule);
if (eregi('Unknown local user',$rule)) {
$rule = 'Unknown local user';
} elseif (preg_match('/Unknown local part (.*) in/iU',$rule,$regs)) {
$rule = preg_replace('/'.preg_quote($regs[1]).'/','.*',$rule);
} elseif (preg_match('/mta(.*)\.mail\.yahoo\.com/iU',$rule)) {
$rule = preg_replace('/mta[\d]+/i','mta[\\d]+',$rule);
}
$rule = trim($rule);
if (!in_array($rule,$rules) && strlen($rule) > 25) {# && $code != 554 && $code != 552) {
if (VERBOSE) {
print "<br/>".htmlspecialchars($rule);
}
array_push($rules,$rule);
#}
switch ($code) {
case 554:case 552:
$action = 'unconfirmuseranddeletebounce';break;
case 550:
$action = 'blacklistuseranddeletebounce';break;
default:
$action = 'unconfirmuseranddeletebounce';break;
}
Sql_Query(sprintf('insert into %s (regex,action,comment,status) values("%s","%s","%s","candidate")',
$GLOBALS['tables']['bounceregex'],addslashes(trim($rule)),$action,'Auto Created from bounce '.$row['id']."\n".' line: '.addslashes($line)),1);
$regexid = sql_insert_id();
if ($regexid) { # most likely duplicate entry if no value
Sql_Query(sprintf('insert into %s (regex,bounce) values(%d,%d)',
$GLOBALS['tables']['bounceregex_bounce'],$regexid,$row['id']),1);
} else {
# print matchedBounceRule($row['data']);
print $GLOBALS['I18N']->get('Hmm, duplicate entry, ').' '.$row['id']." $code $rule<br/>";
}
}
}
}
}
if (!$bouncematched) {
$notmatched++;
}
}
print '<br/>';
print sizeof($rules).' '.$GLOBALS['I18N']->get('new rules found');
print '<br/>';
print $notmatched.' '.$GLOBALS['I18N']->get('bounces not matched');
print '<br/>';
print $existmatch.' '.$GLOBALS['I18N']->get('bounces matched to existing rules');
print $next;
print '<script language="Javascript" type="text/javascript"> finish(); </script>';
releaseLock($process_id);
return;
?>