Développement et bases de données

Générer des rapports CSV de messagerie et de cron depuis cPanel

Vérifié le 8 min de lecture API cPanel rapports

Vous pouvez utiliser UAPI pour inventorier les boîtes mail, les redirections et les réponses automatiques de votre compte. Les exemples suivants s'exécutent avec PHP 8 en SSH ; ce ne sont pas des pages à publier sur le web. Consultez d'abord l'introduction à UAPI.

Préparer un dossier privé

Enregistrez les scripts et leurs résultats en dehors de public_html et des racines de vos autres domaines, par exemple dans /home/usuario_cpanel/reportes. Limitez l'accès à votre utilisateur : les rapports contiennent des adresses et peuvent inclure des commandes avec des informations privées.

Avant d'automatiser, exécutez chaque appel de consultation sur votre compte et vérifiez quels champs renvoie la version installée. Les fonctions dépendent des services et des permissions disponibles. Un rapport vide ne prouve pas qu'il n'existe aucun compte si l'appel a échoué.

Fonctions communes

Enregistrez ce fichier sous le nom funciones.php dans le dossier privé. Vérifiez que exec est disponible dans le PHP du terminal. La fonction n'autorise que les consultations fixes utilisées par ces exemples et vérifie à la fois le processus et l'état UAPI.

<?php

function ejecutar(string $comando): string
{
    $lineas = [];
    $codigo = 0;
    exec($comando, $lineas, $codigo);
    if ($codigo !== 0) {
        throw new RuntimeException('La requête a échoué.');
    }
    return implode("\n", $lineas);
}

function uapi(string $funcion, array $parametros = []): array
{
    $permitidas = [
        'list_pops_with_disk', 'list_forwarders',
        'list_auto_responders', 'get_auto_responder',
    ];
    if (!in_array($funcion, $permitidas, true)) {
        throw new InvalidArgumentException('Fonction non autorisée.');
    }
    $comando = '/usr/local/cpanel/bin/uapi --output=json Email '
        . escapeshellarg($funcion);
    foreach ($parametros as $clave => $valor) {
        if (!in_array($clave, ['domain', 'email'], true)) {
            throw new InvalidArgumentException('Paramètre non autorisé.');
        }
        $comando .= ' ' . escapeshellarg($clave . '=' . $valor);
    }
    $respuesta = json_decode(ejecutar($comando), true, 512, JSON_THROW_ON_ERROR);
    $resultado = $respuesta['result'] ?? [];
    if ((int) ($resultado['status'] ?? 0) !== 1) {
        throw new RuntimeException('Requête refusée par UAPI ; vérifiez les permissions et les paramètres.');
    }
    if (!is_array($resultado['data'] ?? null)) {
        throw new RuntimeException('Format de données inattendu renvoyé par UAPI.');
    }
    return $resultado['data'];
}

function escribirCsv(array $filas): void
{
    foreach ($filas as $fila) {
        $valores = array_map(static function ($valor): string {
            $texto = (string) ($valor ?? '');
            // Empêche que les textes du rapport soient interprétés comme des formules.
            if (preg_match('/^[\s]*[=+@-]/u', $texto)) {
                $texto = "'" . $texto;
            }
            return $texto;
        }, $fila);
        if (fputcsv(STDOUT, $valores, ';', '"', '') === false) {
            throw new RuntimeException('Écriture du CSV impossible.');
        }
    }
}

fputcsv gère correctement les délimiteurs, les guillemets et les sauts de ligne. Importez en outre les colonnes comme texte dans le tableur quand c'est pertinent ; évitez d'ouvrir des rapports d'origine inconnue avec les formules activées.

Boîtes mail et espace utilisé

Enregistrez sous buzones.php :

<?php
require __DIR__ . '/funciones.php';

$filas = [['E-mail', 'Espace utilisé', 'Quota']];
foreach (uapi('list_pops_with_disk') as $cuenta) {
    $filas[] = [
        $cuenta['email'] ?? '',
        $cuenta['humandiskused'] ?? '',
        $cuenta['humandiskquota'] ?? '',
    ];
}
escribirCsv($filas);

Les champs d'espace sont formatés pour une lecture humaine et peuvent inclure des unités ou une valeur de quota illimité. Ne les additionnez pas comme s'il s'agissait de nombres d'octets. Consultez les champs disponibles dans list_pops_with_disk si vous avez besoin d'un autre format.

Redirections d'un domaine

Enregistrez sous reenviadores.php et changez le domaine :

<?php
require __DIR__ . '/funciones.php';

$filas = [['Source', 'Destination']];
foreach (uapi('list_forwarders', ['domain' => 'example.com']) as $regla) {
    $filas[] = [$regla['dest'] ?? '', $regla['forward'] ?? ''];
}
escribirCsv($filas);

L'exemple filtre explicitement un domaine. Répétez la consultation pour chaque domaine à inclure et vérifiez que vous ne dupliquez pas de résultats. Une adresse de destination peut être externe ; la liste ne prouve pas qu'elle reçoit effectivement le courrier. Référence : list_forwarders.

Réponses automatiques

La liste par domaine identifie les réponses configurées. Enregistrez-la sous respuestas.php :

<?php
require __DIR__ . '/funciones.php';

$filas = [['Compte', 'Objet']];
foreach (uapi('list_auto_responders', ['domain' => 'example.com']) as $respuesta) {
    $filas[] = [$respuesta['email'] ?? '', $respuesta['subject'] ?? ''];
}
escribirCsv($filas);

Consultez list_auto_responders pour le format de votre serveur. Si vous avez besoin des dates, consultez aussi get_auto_responder : vérifiez l'identifiant accepté et validez une réponse connue avant de répéter cette consultation pour tous les comptes. Ne retirez pas automatiquement le domaine d'une adresse e-mail ; vous pourriez consulter une autre identité ou ne pas obtenir le résultat prévu.

Les champs de début et de fin peuvent être nuls. Si vous exportez des horodatages Unix, convertissez-les avec un fuseau horaire explicite et indiquez ce fuseau dans l'en-tête. Une réponse configurée n'est pas forcément active au moment du rapport.

Tâches cron

Vous pouvez consulter les tâches de l'utilisateur avec crontab -l. Conservez d'abord sa sortie d'origine comme référence privée. Pour générer un CSV des lignes de programmation habituelles, enregistrez cron.php :

<?php
require __DIR__ . '/funciones.php';

$filas = [['Planification', 'Commande']];
foreach (explode("\n", ejecutar('crontab -l')) as $linea) {
    $linea = trim($linea);
    if ($linea === '' || str_starts_with($linea, '#')
        || preg_match('/^[A-Za-z_][A-Za-z0-9_]*\s*=/', $linea)) {
        continue;
    }
    if (preg_match('/^(@\S+)\s+(.+)$/', $linea, $partes)) {
        $filas[] = [$partes[1], $partes[2]];
    } else {
        $partes = preg_split('/\s+/', $linea, 6);
        if (count($partes) !== 6) {
            throw new RuntimeException('Ligne cron non reconnue.');
        }
        $filas[] = [implode(' ', array_slice($partes, 0, 5)), $partes[5]];
    }
}
escribirCsv($filas);

Si l'utilisateur n'a pas de crontab, la commande peut se terminer par une erreur : vérifiez le message dans le terminal avant d'interpréter le résultat. Ce CSV omet les variables d'environnement et les commentaires ; il sert d'inventaire, pas à restaurer une programmation complète. Il ne représente ni les tâches des autres utilisateurs ni celles du système.

Générer et vérifier chaque rapport

Par exemple :

umask 077
php /home/usuario_cpanel/reportes/buzones.php > /home/usuario_cpanel/reportes/buzones.csv

Utilisez un nouveau nom de sortie et vérifiez que la commande se termine sans erreur. N'utilisez pas le fichier si elle a échoué : la redirection peut laisser un CSV vide ou partiel. Vérifiez l'en-tête, une ligne connue et le nombre de lignes avant de le télécharger. Supprimez les copies temporaires quand vous n'en avez plus besoin.

Cela peut aussi vous aider

Quelque chose cloche ou a changé ? Racontez-nous et nous le vérifions.