. * * ========================= * * This script deletes old DMARC report email messages in mailboxes. * The mailbox parameters and conditions for removal must be specified * in the configuration file. The mailbox accessibility can be checked * on the administration page in the web interface. * The best place to use it is cron. * Note: the current directory must be the one containing the classes directory. * * @category Utilities * @package DmarcSrg * @author Aleksey Andreev (liuch) * @license https://www.gnu.org/licenses/gpl-3.0.html GNU/GPLv3 */ namespace Liuch\DmarcSrg; use Liuch\DmarcSrg\Mail\MailBoxes; use Liuch\DmarcSrg\Sources\SourceAction; use Liuch\DmarcSrg\Exception\RuntimeException; require 'init.php'; if (php_sapi_name() !== 'cli') { echo 'Forbidden'; exit(1); } $core = Core::instance(); $days = $core->config('cleaner/mailboxes/days_old', -1); if (gettype($days) !== 'integer' || $days < 0) { exit(0); } $days_date = (new DateTime())->sub(new \DateInterval("P{$days}D")); $maximum = $core->config('cleaner/mailboxes/delete_maximum', 0); if (gettype($maximum) !== 'integer' || $maximum < 0) { exit(0); } $leave = $core->config('cleaner/mailboxes/leave_minimum', 0); if (gettype($leave) !== 'integer' || $leave < 0) { exit(0); } // Get a list of the configured email boxes $mb_list = new MailBoxes(); $mb_cnt = $mb_list->count(); if ($mb_cnt === 0) { // There are no configured mailboxes exit(0); } // Get the names of mailboxes where processed messages are moved to. $dirs = []; foreach ([ [ 'done', '', 1 ], [ 'failed', 'failed', 0 ] ] as $it) { $opt_nm = $it[0]; $def_opt = $it[1]; $def_cri = $it[2]; $actions = SourceAction::fromSetting($core->config("fetcher/mailboxes/when_{$opt_nm}", ''), 0, ''); if (count($actions) === 0) { $dir = $def_opt; } else { $dir = null; foreach ($actions as $act) { if ($act->type === SourceAction::ACTION_MOVE) { $dir = $act->param; break; } } if (is_null($dir)) { continue; } } switch (strtolower($core->config("cleaner/mailboxes/{$opt_nm}", ''))) { case 'any': $cri = 2; break; case 'seen': $cri = 1; break; case '': $cri = $def_cri; break; default: $cri = 0; break; } if (empty($dir) && $cri > 1) { $cri = 1; } $dirs[$dir] = min(($dirs[$dir] ?? $cri), $cri); } try { for ($mb_idx = 1; $mb_idx <= $mb_cnt; ++$mb_idx) { foreach ($dirs as $dir_name => $i_criteria) { if ($i_criteria > 0) { $criteria = $i_criteria === 2 ? 'ALL' : 'SEEN'; $mbox = $mb_list->mailbox($mb_idx); if (!empty($dir_name)) { if (!($mbox = $mbox->childMailbox($dir_name))) { continue; } } $s_res = $mbox->sort(SORTDATE, $criteria, false); $max = $maximum > 0 ? $maximum : -1; $lv = $leave === 0 ? count($s_res) : count($s_res) - $leave; $i = 0; while ($lv-- > 0) { $m_num = $s_res[$i++]; $msg = $mbox->message($m_num); $mo = $msg->overview(); if (isset($mo->date)) { try { $md = new DateTime($mo->date); } catch (\Exception $e) { $md = false; } if ($md !== false) { if ($md > $days_date) { break; } $mbox->deleteMessage($m_num); if ($max > 0) { if (--$max === 0) { break; } } } } } } } } } catch (RuntimeException $e) { echo ErrorHandler::exceptionText($e); exit(1); } exit(0);