diff --git a/mailscanner/auto-release.php b/mailscanner/auto-release.php index 20f7dc336..746f752df 100644 --- a/mailscanner/auto-release.php +++ b/mailscanner/auto-release.php @@ -91,7 +91,7 @@
<?php echo __('mwlogo99'); ?>
-

+

' . $msg . '

'; diff --git a/mailscanner/conf.php.example b/mailscanner/conf.php.example index 6cb2547bc..711bb348b 100644 --- a/mailscanner/conf.php.example +++ b/mailscanner/conf.php.example @@ -156,6 +156,8 @@ define('MAILWATCH_HOSTURL', 'http://' . rtrim(gethostname()) . '/mailscanner'); // the clean.quarantine script provided with MailScanner. define('QUARANTINE_USE_FLAG', true); define('QUARANTINE_DAYS_TO_KEEP', 30); +//Set QUARANTINE_FILTERS_COMBINED to true to combine quarantine report into a single report when user filters are present +define('QUARANTINE_FILTERS_COMBINED', false); define('QUARANTINE_REPORT_FROM_NAME', 'MailWatch for MailScanner'); define('QUARANTINE_REPORT_SUBJECT', 'Message Quarantine Report'); define('QUARANTINE_SUBJECT', 'Message released from quarantine'); diff --git a/mailscanner/functions.php b/mailscanner/functions.php index 22e3867f0..97ed22774 100644 --- a/mailscanner/functions.php +++ b/mailscanner/functions.php @@ -3969,6 +3969,7 @@ function checkConfVariables() 'PROXY_TYPE', 'PROXY_USER', 'QUARANTINE_DAYS_TO_KEEP', + 'QUARANTINE_FILTERS_COMBINED', 'QUARANTINE_MSG_BODY', 'QUARANTINE_REPORT_DAYS', 'QUARANTINE_REPORT_FROM_NAME', diff --git a/tools/Cron_jobs/mailwatch_quarantine_report.php b/tools/Cron_jobs/mailwatch_quarantine_report.php index 3941cbc72..41f07ffdc 100755 --- a/tools/Cron_jobs/mailwatch_quarantine_report.php +++ b/tools/Cron_jobs/mailwatch_quarantine_report.php @@ -50,7 +50,8 @@ 'SUBJECT_MAXLEN', 'TIME_ZONE', 'DATE_FORMAT', - 'TIME_FORMAT' + 'TIME_FORMAT', + 'QUARANTINE_FILTERS_COMBINED' ); $required_constant_missing_count = 0; foreach ($required_constant as $constant) { @@ -178,6 +179,7 @@ SELECT DISTINCT a.id AS id, DATE_FORMAT(timestamp,'" . str_replace('%', '%%', DATE_FORMAT) . '
' . str_replace('%', '%%', TIME_FORMAT) . "') AS datetime, +a.timestamp AS timestamp, a.to_address AS to_address, a.from_address AS from_address, a.subject AS subject, @@ -201,8 +203,7 @@ maillog a WHERE a.quarantined = 1 -AND - ((to_address=%s) OR (to_domain=%s)) +AND ((to_address =%s) OR (to_domain =%s)) AND a.date >= DATE_SUB(CURRENT_DATE(), INTERVAL " . QUARANTINE_REPORT_DAYS . ' DAY)'; @@ -288,14 +289,60 @@ if (!empty($email) && false !== $email) { dbg(" ==== Recipient e-mail address is $email"); // Get any additional reports required - $filters = array_merge(array($email), return_user_filters($user->username)); - foreach ($filters as $filter) { - dbg(" ==== Building list for $filter"); - $quarantined = return_quarantine_list_array($filter, $to_domain); - dbg(' ==== Found ' . count($quarantined) . ' quarantined e-mails'); - //print_r($quarantined); + $filters = array_merge(array($to_address), return_user_filters($user->username)); + if (false === QUARANTINE_FILTERS_COMBINED) { + foreach ($filters as $filter) { + if ($user->type === 'D') { + if (preg_match('/(\S+)@(\S+)/', $filter, $split)) { + $filter_domain = $split[2]; + } else { + $filter_domain = $filter; + } + dbg(" ==== Building list for $filter_domain"); + $quarantined = return_quarantine_list_array($filter, $filter_domain); + } else { + dbg(" ==== Building list for $filter"); + $quarantined = return_quarantine_list_array($filter, $to_domain); + } + dbg(' ==== Found ' . count($quarantined) . ' quarantined e-mails'); + //print_r($quarantined); + if (count($quarantined) > 0) { + if ($user->type === 'D') { + send_quarantine_email($email, $filter_domain, $quarantined); + } else { + send_quarantine_email($email, $filter, $quarantined); + } + } + unset($quarantined); + } + } else { + //combined + $quarantine_list = array(); + foreach ($filters as $filter) { + if ($user->type === 'D') { + if (preg_match('/(\S+)@(\S+)/', $filter, $split)) { + $filter_domain = $split[2]; + } else { + $filter_domain = $filter; + } + $quarantine_list[] = $filter_domain; + dbg(" ==== Building list for $filter_domain"); + $tmp_quarantined = return_quarantine_list_array($filter, $filter_domain); + } else { + $quarantine_list[] = $filter; + dbg(" ==== Building list for $filter"); + $tmp_quarantined = return_quarantine_list_array($filter, $to_domain); + } + dbg(' ==== Found ' . count($tmp_quarantined) . ' quarantined e-mails'); + if (isset($quarantined) && is_array($quarantined)) { + $quarantined = array_merge($quarantined, $tmp_quarantined); + } else { + $quarantined = $tmp_quarantined; + } + } if (count($quarantined) > 0) { - send_quarantine_email($email, $filter, $quarantined); + $list = implode(', ', $quarantine_list); + send_quarantine_email($email, $list, quarantine_sort($quarantined)); } unset($quarantined); } @@ -351,7 +398,8 @@ function return_quarantine_list_array($to_address, $to_domain) 'to' => trim_output($row->to_address, FROMTO_MAXLEN), 'from' => trim_output($row->from_address, FROMTO_MAXLEN), 'subject' => trim_output($row->subject, SUBJECT_MAXLEN), - 'reason' => trim($row->reason) + 'reason' => trim($row->reason), + 'timestamp' => trim($row->timestamp) ); } } @@ -476,3 +524,17 @@ function send_quarantine_email($email, $filter, $quarantined) dbg(" ==== ERROR sending e-mail to $email ". $isSent); } } + +/** + * @param $q + * @return array + */ +function quarantine_sort($q) +{ + $key = 'timestamp'; + usort($q, function ($a, $b) use (&$key) { + return strtotime($a[$key]) - strtotime($b[$key]); + }); + $sorted = array_reverse($q); + return $sorted; +}