Entwicklung und Datenbanken

CSV-Berichte zu E-Mail und Cron aus cPanel erstellen

Geprüft am 8 Min. Lesezeit cpanel api reportes

Mit UAPI können Sie die Postfächer, Weiterleitungen und Autoresponder Ihres Kontos erfassen. Die folgenden Beispiele laufen mit PHP 8 per SSH; es sind keine Seiten, die Sie im Web veröffentlichen. Lesen Sie vorher die Einführung in UAPI.

Einen privaten Ordner vorbereiten

Speichern Sie die Skripte und ihre Ergebnisse außerhalb von public_html und der Stammverzeichnisse Ihrer anderen Domains, zum Beispiel in /home/usuario_cpanel/reportes. Beschränken Sie den Zugriff auf Ihren Benutzer: Die Berichte enthalten Adressen und können Befehle mit privaten Informationen enthalten.

Führen Sie vor der Automatisierung jeden Abfrageaufruf in Ihrem Konto aus und prüfen Sie, welche Felder die installierte Version zurückgibt. Die Funktionen hängen von den verfügbaren Diensten und Berechtigungen ab. Ein leerer Bericht beweist nicht, dass es keine Konten gibt, wenn der Aufruf fehlgeschlagen ist.

Gemeinsame Funktionen

Speichern Sie diese Datei als funciones.php im privaten Ordner. Prüfen Sie, ob exec im PHP des Terminals verfügbar ist. Die Funktion erlaubt nur die festen Abfragen dieser Beispiele und prüft sowohl den Prozess als auch den UAPI-Status.

<?php

function ejecutar(string $comando): string
{
    $lineas = [];
    $codigo = 0;
    exec($comando, $lineas, $codigo);
    if ($codigo !== 0) {
        throw new RuntimeException('La consulta no terminó correctamente.');
    }
    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('Función no admitida.');
    }
    $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('Parámetro no admitido.');
        }
        $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('UAPI rechazó la consulta; revisa permisos y parámetros.');
    }
    if (!is_array($resultado['data'] ?? null)) {
        throw new RuntimeException('UAPI devolvió un formato de datos inesperado.');
    }
    return $resultado['data'];
}

function escribirCsv(array $filas): void
{
    foreach ($filas as $fila) {
        $valores = array_map(static function ($valor): string {
            $texto = (string) ($valor ?? '');
            // Evita que textos del informe se interpreten como fórmulas.
            if (preg_match('/^[\s]*[=+@-]/u', $texto)) {
                $texto = "'" . $texto;
            }
            return $texto;
        }, $fila);
        if (fputcsv(STDOUT, $valores, ';', '"', '') === false) {
            throw new RuntimeException('No se pudo escribir el CSV.');
        }
    }
}

fputcsv behandelt Trennzeichen, Anführungszeichen und Zeilenumbrüche korrekt. Importieren Sie die Spalten in der Tabellenkalkulation außerdem als Text, wo es sinnvoll ist; öffnen Sie Berichte unbekannter Herkunft nicht mit aktivierten Formeln.

Postfächer und Speicherverbrauch

Speichern Sie als buzones.php:

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

$filas = [['Email', 'Espacio usado', 'Cuota']];
foreach (uapi('list_pops_with_disk') as $cuenta) {
    $filas[] = [
        $cuenta['email'] ?? '',
        $cuenta['humandiskused'] ?? '',
        $cuenta['humandiskquota'] ?? '',
    ];
}
escribirCsv($filas);

Die Speicherfelder sind für Menschen aufbereitet und können Einheiten oder einen Wert für unbegrenztes Kontingent enthalten. Addieren Sie sie nicht wie Byte-Zahlen. Wenn Sie ein anderes Format brauchen, sehen Sie die verfügbaren Felder unter list_pops_with_disk nach.

Weiterleitungen einer Domain

Speichern Sie als reenviadores.php und ändern Sie die Domain:

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

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

Das Beispiel filtert ausdrücklich nach einer Domain. Wiederholen Sie die Abfrage für die Domains, die Sie aufnehmen möchten, und achten Sie darauf, keine Ergebnisse doppelt zu erfassen. Eine Zieladresse kann extern sein; die Liste belegt nicht, dass dort E-Mails zugestellt werden. Referenz: list_forwarders.

Autoresponder

Die Liste pro Domain zeigt die eingerichteten Autoresponder. Speichern Sie sie als respuestas.php:

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

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

Das Format Ihres Servers finden Sie unter list_auto_responders. Wenn Sie Datumsangaben brauchen, sehen Sie sich auch get_auto_responder an: Prüfen Sie den akzeptierten Bezeichner und testen Sie einen bekannten Autoresponder, bevor Sie diese Abfrage für alle Konten wiederholen. Schneiden Sie die Domain nicht automatisch von einer E-Mail-Adresse ab; Sie könnten eine andere Identität abfragen oder nicht das erwartete Ergebnis erhalten.

Die Felder für Beginn und Ende können leer (null) sein. Wenn Sie Unix-Zeitstempel exportieren, wandeln Sie sie mit einer expliziten Zeitzone um und geben Sie diese in der Kopfzeile an. Ein eingerichteter Autoresponder ist nicht unbedingt zum Zeitpunkt des Berichts aktiv.

Cron-Jobs

Die Jobs des Benutzers können Sie mit crontab -l abfragen. Bewahren Sie zuerst die Originalausgabe als private Referenz auf. Um ein CSV der üblichen Zeitplanzeilen zu erstellen, speichern Sie cron.php:

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

$filas = [['Programación', 'Comando']];
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('Hay una línea cron no reconocida.');
        }
        $filas[] = [implode(' ', array_slice($partes, 0, 5)), $partes[5]];
    }
}
escribirCsv($filas);

Hat der Benutzer keine Crontab, kann der Befehl mit einem Fehler enden: Prüfen Sie die Meldung im Terminal, bevor Sie das Ergebnis auswerten. Dieses CSV lässt Umgebungsvariablen und Kommentare weg; es dient der Bestandsaufnahme, nicht der Wiederherstellung eines vollständigen Zeitplans. Es enthält weder die Jobs anderer Benutzer noch die des Systems.

Jeden Bericht erstellen und prüfen

Zum Beispiel:

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

Verwenden Sie einen neuen Ausgabenamen und prüfen Sie, ob der Befehl ohne Fehler endet. Verwenden Sie die Datei nicht, wenn er fehlgeschlagen ist: Die Umleitung kann ein leeres oder unvollständiges CSV hinterlassen. Prüfen Sie Kopfzeile, eine bekannte Zeile und die Anzahl, bevor Sie es herunterladen. Löschen Sie die temporären Kopien, sobald Sie sie nicht mehr brauchen.

Das könnte Ihnen auch helfen

Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.