Start · Sprachen · PHP · Referenz · mailparse_msg_extract_part_file

mailparse_msg_extract_part_file

Funktion

Extrahiert und dekodiert einen Nachrichtenabschnitt (MIME-Part) aus einer E-Mail-Nachricht in eine Datei oder übergibt ihn an einen Callback.

seit PHP 4.1.0 Kategorie: http

Signatur

mailparse_msg_extract_part_file(resource $mimemail, mixed $msgbody, callable $callback = ?): string

Beschreibung

mailparse_msg_extract_part_file() gehört zur PHP-Mailparse-Erweiterung und dient dazu, einen bestimmten MIME-Abschnitt einer E-Mail-Nachricht zu extrahieren und dabei die im Header angegebene Kodierung (z. B. quoted-printable oder base64) automatisch zu dekodieren. Der Inhalt des Abschnitts wird dabei aus einer Datei gelesen, die durch $msgbody angegeben wird.

Diese Funktion ist nützlich, wenn man eine vollständige Roh-E-Mail-Datei vorliegen hat (z. B. als .eml-Datei) und gezielt einzelne Teile – etwa Anhänge oder den Textinhalt – extrahieren möchte, ohne die gesamte Datei in den Speicher zu laden. Im Unterschied zu mailparse_msg_extract_part(), die mit einem String arbeitet, wird hier eine Dateiressource oder ein Dateiname übergeben.

Wird ein $callback angegeben, wird der dekodierte Inhalt des MIME-Parts stückweise an diese Funktion übergeben, anstatt direkt zurückgegeben zu werden. Dies erlaubt eine speichereffiziente Verarbeitung großer Anhänge, z. B. direktes Schreiben in eine Ausgabedatei.

Die Funktion wird typischerweise in Kombination mit mailparse_msg_parse_file() und mailparse_msg_get_structure() eingesetzt, um zunächst die Struktur der Nachricht zu analysieren und dann gezielt Abschnitte zu extrahieren.

Parameter

Name Typ Default Beschreibung
$mimemail Pflicht resource Eine MIME-E-Mail-Ressource, die zuvor mit mailparse_msg_create(), mailparse_msg_parse_file() oder mailparse_msg_get_part() erstellt wurde.
$msgbody Pflicht mixed Entweder ein geöffneter Datei-Handle (Ressource) oder ein Dateiname als String, der die vollständige Roh-E-Mail enthält, aus der der Abschnitt extrahiert werden soll.
$callback callable Optionaler Callback, der für jeden dekodierten Chunk des Abschnitts aufgerufen wird. Wird kein Callback angegeben, gibt die Funktion den dekodierten Inhalt als String zurück.

Rückgabewert

Typ
string
Beschreibung
Gibt den dekodierten Inhalt des MIME-Abschnitts als String zurück, wenn kein $callback angegeben wurde. Mit Callback wird der Inhalt an diesen übergeben und die Funktion gibt einen leeren String zurück. Bei einem Fehler wird false zurückgegeben.

Beispiele

Textinhalt einer E-Mail-Datei extrahieren

<?php
// E-Mail-Datei parsen
$mail = mailparse_msg_parse_file('/pfad/zur/email.eml');

if (!$mail) {
    die('Fehler beim Parsen der E-Mail.');
}

// Struktur der Nachricht ermitteln
$structure = mailparse_msg_get_structure($mail);

foreach ($structure as $partId) {
    $part = mailparse_msg_get_part($mail, $partId);
    $partData = mailparse_msg_get_part_data($part);

    // Nur den Text-Part verarbeiten
    if ($partData['content-type'] === 'text/plain') {
        $decoded = mailparse_msg_extract_part_file($part, '/pfad/zur/email.eml');
        echo "Textinhalt:\n" . $decoded;
    }

    mailparse_msg_free($part);
}

mailparse_msg_free($mail);
Textinhalt: Hello World! Dies ist der Textinhalt der E-Mail.

Anhang mit Callback in Datei schreiben

<?php
$mail = mailparse_msg_parse_file('/pfad/zur/email.eml');
$structure = mailparse_msg_get_structure($mail);

$outputFile = fopen('/tmp/anhang.pdf', 'wb');

foreach ($structure as $partId) {
    $part = mailparse_msg_get_part($mail, $partId);
    $partData = mailparse_msg_get_part_data($part);

    if ($partData['content-type'] === 'application/pdf') {
        // Callback schreibt jeden Chunk direkt in die Zieldatei
        mailparse_msg_extract_part_file(
            $part,
            '/pfad/zur/email.eml',
            function (string $chunk) use ($outputFile) {
                fwrite($outputFile, $chunk);
            }
        );
        echo "PDF-Anhang wurde gespeichert.\n";
    }

    mailparse_msg_free($part);
}

fclose($outputFile);
mailparse_msg_free($mail);
PDF-Anhang wurde gespeichert.

// Wichtig · Fallstricke

Erweiterung erforderlich: Diese Funktion ist nur verfügbar, wenn die mailparse-PECL-Erweiterung installiert und aktiviert ist. Sie ist nicht Teil des PHP-Kerns.

Sicherheitshinweis: Beim Speichern von Anhängen aus E-Mails sollte der Dateiname niemals direkt aus dem MIME-Header übernommen werden (z. B. aus content-disposition), da er Pfadtraversierungs-Angriffe ermöglichen kann (../../etc/passwd). Den Dateinamen stets bereinigen oder durch einen eigenen sicheren Namen ersetzen.

Ressourcenfreigabe: Mit mailparse_msg_get_part() erstellte Teil-Ressourcen müssen nach der Verwendung explizit mit mailparse_msg_free() freigegeben werden, um Speicherlecks zu vermeiden.