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 @@
-
+
' . $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;
+}