Start · Sprachen · PHP · Referenz · mailparse_uudecode_all

mailparse_uudecode_all

Funktion

Durchsucht den Inhalt einer geöffneten Datei-Ressource und extrahiert alle darin eingebetteten uuencodierten Dateien.

Kategorie: http

Signatur

mailparse_uudecode_all(resource $fp): array|false

Beschreibung

mailparse_uudecode_all() liest den gesamten Inhalt des durch $fp angegebenen Datei-Handles und sucht nach uuencodierten Abschnitten (erkennbar an begin/end-Blöcken). Alle gefundenen Abschnitte werden dekodiert und als temporäre Dateien gespeichert.

Die Funktion gibt ein Array von assoziativen Arrays zurück. Jeder Eintrag enthält den Dateinamen (filename) und einen Datei-Handle (fp), der auf den dekodierten Inhalt zeigt. Der erste Eintrag repräsentiert dabei den Klartext-Anteil der Nachricht (also den Teil vor dem ersten uuencodierten Block).

Diese Funktion ist besonders nützlich, wenn alte E-Mail-Anhänge oder Newsgroup-Beiträge verarbeitet werden sollen, die noch im UUencode-Format vorliegen – einem Kodierungsverfahren, das vor Base64 weit verbreitet war. Sie gehört zur PECL-Erweiterung mailparse und steht nur zur Verfügung, wenn diese installiert und aktiviert ist.

Nach der Verwendung sollten die zurückgegebenen Datei-Handles mit fclose() geschlossen werden, um Ressourcenlecks zu vermeiden.

Parameter

Name Typ Default Beschreibung
$fp Pflicht resource Ein gültiger, geöffneter Datei-Handle (z. B. von fopen()), dessen Inhalt nach uuencodierten Blöcken durchsucht werden soll. Der Zeiger muss am Anfang der Datei stehen oder dorthin zurückgesetzt sein.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein indiziertes Array zurück, wobei jedes Element ein assoziatives Array mit den Schlüsseln filename (Dateiname des dekodierten Abschnitts) und fp (Datei-Handle des temporären, dekodierten Inhalts) enthält. Das erste Element ([0]) enthält stets den Klartext-Anteil. Bei einem Fehler wird false zurückgegeben.

Beispiele

Uuencodierte Anhänge aus einer E-Mail-Datei extrahieren

<?php
// Beispiel-E-Mail-Datei mit uuencodierten Anhängen öffnen
$fp = fopen('email_with_uuencoded.txt', 'r');

if ($fp === false) {
    die('Datei konnte nicht geöffnet werden.');
}

$decoded = mailparse_uudecode_all($fp);
fclose($fp);

if ($decoded === false) {
    die('Dekodierung fehlgeschlagen.');
}

foreach ($decoded as $index => $part) {
    if ($index === 0) {
        echo "--- Klartext-Anteil ---\n";
    } else {
        echo "--- Anhang: " . $part['filename'] . " ---\n";
    }

    // Inhalt des temporären Handles lesen
    rewind($part['fp']);
    $content = stream_get_contents($part['fp']);
    echo substr($content, 0, 200) . "\n";

    // Handle schließen, um Ressourcen freizugeben
    fclose($part['fp']);
}
?>

Dekodierte Datei auf dem Dateisystem speichern

<?php
$fp = fopen('newsgroup_post.txt', 'r');

if ($fp === false) {
    die('Datei konnte nicht geöffnet werden.');
}

$parts = mailparse_uudecode_all($fp);
fclose($fp);

if (is_array($parts)) {
    // Ersten Eintrag überspringen (Klartext)
    for ($i = 1; $i < count($parts); $i++) {
        $filename = basename($parts[$i]['filename']);
        $destination = '/tmp/decoded/' . $filename;

        rewind($parts[$i]['fp']);
        $data = stream_get_contents($parts[$i]['fp']);
        fclose($parts[$i]['fp']);

        file_put_contents($destination, $data);
        echo "Gespeichert: $destination\n";
    }
}
?>

// Wichtig · Fallstricke

Erweiterung erforderlich: mailparse_uudecode_all() ist Teil der PECL-Erweiterung mailparse. Sie muss separat installiert werden (pecl install mailparse) und ist nicht Bestandteil der PHP-Kerninstallation.

Ressourcenverwaltung: Die zurückgegebenen fp-Handles zeigen auf temporäre Dateien. Diese sollten nach der Verarbeitung stets mit fclose() geschlossen werden, damit das Betriebssystem die temporären Dateien aufräumen kann.

Sicherheitshinweis: Der im Ergebnis enthaltene filename-Schlüssel stammt direkt aus dem kodierten Block und sollte vor der Verwendung im Dateisystem zwingend mit basename() bereinigt und auf zulässige Zeichen geprüft werden, um Path-Traversal-Angriffe (z. B. ../../etc/passwd) zu verhindern.

Veraltetes Format: UUencode ist ein älteres Kodierungsverfahren und wird in modernen E-Mails kaum noch verwendet. Aktuelle Systeme nutzen stattdessen Base64 gemäß MIME-Standard. Diese Funktion ist daher hauptsächlich für die Verarbeitung von Archivdaten oder älteren Nachrichten relevant.