2.8.1.6. Видалення старих листів з поштової скриньки

Увага!

При великому обсязі поштової скриньки скрипт може не встигнути видалити листи за один прохід і може знадобитися повторний запуск.

Скрипт дозволяє видаляти листи за певний проміжок часу, який можна вказати щодо поточного дня або фіксовані дати.

  1. <?php
  2. $Host = isset($argv[1]) ? $argv[1] : "mail.adm.tools:143";
  3. $User = isset($argv[2]) ? $argv[2] : "user@example.com";
  4. $Password = isset($argv[3]) ? $argv[3] : "example_password";
  5. $Before = isset($argv[4]) ? date("Y-m-d", strtotime($argv[4])) : date("Y-m-d", strtotime("-1 year"));
  6. $After = isset($argv[5]) ? date("Y-m-d", strtotime($argv[5])) : date("Y-m-d", strtotime("1970-01-01")); //Older date
  7.  
  8. $Before = 'BEFORE "' . $Before . '"';
  9. $After = 'SINCE "' . $After . '"';
  10.  
  11. $mbox = imap_open("{" . $Host . "/novalidate-cert}INBOX", $User, $Password) or die("Can't connect: " . imap_last_error());
  12.  
  13. try {
  14. if (empty(imap_check($mbox))) {
  15. throw new Exception("Error is occurred");
  16. }
  17. $emails = imap_search($mbox, "$Before $After");
  18. if (empty($emails)) {
  19. throw new Exception("Don't have mail " . strtolower($Before));
  20. }
  21. foreach ($emails as $email_id) {
  22. imap_delete($mbox, $email_id);
  23. '/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)\r\n/m',
  24. imap_fetchheader($mbox, $email_id),
  25. $matches
  26. );
  27. $headers = array_combine($matches[1], $matches[2]);
  28. print_r("$email_id : " . imap_utf8($headers['Subject']) . " => " . $headers['Date'] . "\n<br>");
  29. }
  30. imap_expunge($mbox);
  31. echo "Deleted " . count($emails) . " letters " . strtolower($Before) . "\n";
  32. } catch (Exception $e) {
  33. echo $e->getMessage(), "\n";
  34. }

Необхідні для роботи скрипта дані можна вказати як в самому скрипті, так і в командному рядку при запуску:

  • Hostадреса і порт IMAP-сервера.
  • Userназва поштової скриньки.
  • Passwordпароль поштової скриньки.
  • Before — листи раніше вказаної дати будуть видалені. Вказати дату можна замінивши -1 year на конкретну дату, у форматі РРРР-ММ-ДД (2010-02-23) або забираючи від поточної дати певну кількість часу у форматі -1 year або -1 month або -1 day.
  • After — листи пізніше за вказану дату будуть видалені. Вказати дату можна замінивши 1970-01-01 на конкретну дату, у форматі РРРР-ММ-ДД (2010-02-22) або забираючи від поточної дати певну кількість часу у форматі -1 year або -1 month або -1 day.

Запуск скрипта в консолі або завданню cron виконується командою виду:

/usr/local/bin/php /home/example/file.php mail.adm.tools:143 admin@example.com "password" "2022-03-24" "2015-04-28"
Зміст