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"
Содержание