2.8.1.7. Удаление старых писем из почтового ящика

Внимание!

  • Этот скрипт является мощным инструментом для управления почтовыми ящиками и должен быть использован с осторожностью.
  • При большом объёме почтового ящика скрипт может не успеть удалить письма за один проход и может потребоваться повторный запуск.
Для работы скрипта требуется версия PHP 8.3 или ниже.

Скрипт удаления писем за определённый интервал времени:

<?php

if (php_sapi_name() !== 'cli') {
    die("Access Denied: This script can only be run from the command line.\n");
}

$options = getopt('', [
    'hostname::',
    'port::',
    'ssl::',
    'username:',
    'password:',
    'folders::',
    'from-date::',
    'to-date:',
]);

$hostname = isset($options['hostname']) ? $options['hostname'] : 'mail.adm.tools';
$port = isset($options['port']) ? $options['port'] : 143;
$username = $options['username'] ?? die("Error: 'username' parameter is required.\n");
$password = $options['password'] ?? die("Error: 'password' parameter is required.\n");
$ssl = isset($options['ssl']) ? $options['ssl'] : (($port == 993) ? 'y' : 'n');

$folders = isset($options['folders']) ? explode(',', $options['folders']) : ['INBOX'];
$fromDate = isset($options['from-date']) ? $options['from-date'] : '1-Jan-1970';
if (!isset($options['to-date'])) {
    die("Error: 'to-date' parameter is required.\n");
}
$toDate = $options['to-date'];

$connectionString = '{' . $hostname . ':' . $port . (($ssl == 'y') ? '/imap/ssl' : '/imap') . '}';

echo "Connecting to server: $connectionString\n";
echo "Searching emails in folders: " . implode(', ', $folders) . "\n";

foreach ($folders as $folder) {
    $fullFolderName = (stripos($folder, 'INBOX') === 0) ? $folder : 'INBOX.' . $folder;
    $imapStream = imap_open($connectionString . $fullFolderName, $username, $password);

    if (!$imapStream) {
        echo "Error: Could not open folder $fullFolderName\n";
        continue;
    }

    $searchCriteria = 'SINCE "' . $fromDate . '" BEFORE "' . $toDate . '"';
    $emails = imap_search($imapStream, $searchCriteria);

    if ($emails) {
        echo "Found " . count($emails) . " emails in folder $fullFolderName\n";

        foreach ($emails as $emailNumber) {
            $deleteStatus = imap_delete($imapStream, $emailNumber);
            if ($deleteStatus) {
                echo "Successfully deleted email with ID $emailNumber in folder $fullFolderName\n";
            } else {
                echo "Error deleting email with ID $emailNumber in folder $fullFolderName\n";
            }
        }

        imap_expunge($imapStream);
    } else {
        echo "No emails found in folder $fullFolderName matching criteria\n";
    }

    imap_close($imapStream);
}

echo "Done.\n";

Аргументы командной строки при запуске скрипта:

  • hostname — адрес IMAP-сервера (по умолчанию mail.adm.tools).
  • port — порт сервера (по умолчанию 143).
  • ssl — принудительное использование SSL (y — использовать, n — не использовать).
  • username (обязательный параметр) — адрес почтового ящика.
  • password (обязательный параметр) — пароль почтового ящика.
  • folders — папки для поиска и удаления писем (по умолчанию папка входящих INBOX).
  • from-date — с какой даты удалять письма в формате День-Месяц-Год (по умолчанию 1-Jan-1970).
  • to-date (обязательный параметр) — по какую дату удалять письма в формате День-Месяц-Год.

Пример команды запуска скрипта в консоли или cron:

/usr/local/bin/php /home/example/file.php --hostname="mail.example.com" --port=993 --ssl=y --username="your-email@example.com" --password="your-email-password" --folders="INBOX,Sent" --from-date="1-Jan-2025" --to-date="1-Jan-2025"
Содержание

    (1)