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)