#!/usr/bin/env php
<?php

echo "-- Debut de ".__FILE__."\n";

// Chemin vers le fichier de log
$logFile = '/var/log/mail.log';
// Chemin vers le fichier pour stocker les IDs traités
$processedIdsFile = '/var/log/processed_ids_deferred.txt';

// Fonction pour lire les IDs traités à partir du fichier
function readProcessedIds($file) {
    if (!file_exists($file)) {
        return [];
    }
    $content = file_get_contents($file);
    return $content ? explode(PHP_EOL, trim($content)) : [];
}

// Fonction pour écrire les IDs traités dans le fichier
function writeProcessedIds($file, $ids) {
    file_put_contents($file, implode(PHP_EOL, $ids) . PHP_EOL);
}

// Lire les IDs déjà traités
$processedIds = readProcessedIds($processedIdsFile);

// Expression régulière pour trouver les messages d'erreur spécifiques avec status=deferred et extraire l'ID du message
$pattern = '/postfix\/smtp\[\d+\]: (\w+): .* status=deferred /';

// Lire le fichier de log
$logContent = file_get_contents($logFile);

if ($logContent === false) {
    die("Erreur lors de la lecture du fichier de log.\n");
}

// Rechercher les correspondances
preg_match_all($pattern, $logContent, $matches);

// Extraire les IDs de message
$messageIds = array_unique($matches[1]);

if (empty($messageIds)) {
    echo "Aucun message à supprimer de la file d'attente.\n";
    echo "-- Fin de ".__FILE__."\n";
    exit;
}

// Filtrer les IDs pour ne conserver que ceux qui n'ont pas encore été traités
$newMessageIds = array_diff($messageIds, $processedIds);
if (empty($newMessageIds)) {
    echo "Tous les messages ont déjà été traités.\n";
    echo "-- Fin de ".__FILE__."\n";
    exit;
}

// Supprimer les messages de la file d'attente
foreach ($newMessageIds as $messageId) {
    $command = "postsuper -d $messageId";
    $output = [];
    $return_var = 0;
    exec($command, $output, $return_var);
    
    if ($return_var === 0) {
        echo "Message $messageId supprimé de la file d'attente.\n";
        $processedIds[] = $messageId;
    } else {
        echo "Erreur lors de la suppression du message $messageId de la file d'attente.\n";
    }
}

// Mettre à jour le fichier des IDs traités
writeProcessedIds($processedIdsFile, $processedIds);

echo "-- Fin de ".__FILE__."\n";

