Start · Sprachen · PHP · Referenz · mailparse_msg_get_structure

mailparse_msg_get_structure

Funktion

Gibt ein Array aller MIME-Abschnittsnamen (Sections) einer geparsten E-Mail-Nachricht zurück.

Kategorie: http

Signatur

mailparse_msg_get_structure(resource $mimemail): array

Beschreibung

mailparse_msg_get_structure() liest eine bereits geparste MIME-Nachricht und liefert ein Array mit den Namen aller enthaltenen MIME-Abschnitte (Sections). Diese Abschnittsnamen folgen der hierarchischen MIME-Struktur und werden als Zeichenketten wie "1", "1.1", "1.2" usw. angegeben.

Die Funktion ist besonders hilfreich, wenn man den Aufbau einer E-Mail analysieren möchte, bevor man auf einzelne Teile – etwa Text-Body, HTML-Body oder Anhänge – zugreift. Mit den zurückgegebenen Namen kann man gezielt mailparse_msg_get_part() und mailparse_msg_get_part_data() aufrufen, um Details zu jedem Abschnitt zu ermitteln.

Der Parameter $mimemail muss eine gültige MIME-Ressource sein, die zuvor mit mailparse_msg_create() erzeugt und mit mailparse_msg_parse() oder mailparse_msg_parse_file() befüllt wurde. Die Funktion gehört zur PECL-Erweiterung mailparse, die separat installiert werden muss.

Die Abschnittsnamen entsprechen dem IMAP-Body-Structure-Format (RFC 3501): der Wurzelabschnitt heißt "1", Unterabschnitte werden als "1.1", "1.2" etc. nummeriert – analog zur verschachtelten Struktur von Multipart-Nachrichten.

Parameter

Name Typ Default Beschreibung
$mimemail Pflicht resource Eine gültige MIME-Mail-Ressource, die zuvor mit mailparse_msg_create() erzeugt und geparst wurde.

Rückgabewert

Typ
array
Beschreibung
Ein indiziertes Array von Zeichenketten, das die Namen aller MIME-Abschnitte der Nachricht enthält, z. B. ["1", "1.1", "1.2"]. Bei einer einfachen Nachricht ohne Unterteile enthält das Array nur "1".

Beispiele

Struktur einer Multipart-E-Mail ausgeben

<?php
// Rohe E-Mail-Nachricht (vereinfachtes Beispiel)
$rawEmail = "From: sender@example.com\r\n"
    . "To: empfaenger@example.com\r\n"
    . "MIME-Version: 1.0\r\n"
    . "Content-Type: multipart/alternative; boundary=\"BOUNDARY\"\r\n"
    . "\r\n"
    . "--BOUNDARY\r\n"
    . "Content-Type: text/plain; charset=UTF-8\r\n"
    . "\r\n"
    . "Hallo als Text.\r\n"
    . "--BOUNDARY\r\n"
    . "Content-Type: text/html; charset=UTF-8\r\n"
    . "\r\n"
    . "&lt;p&gt;Hallo als HTML.&lt;/p&gt;\r\n"
    . "--BOUNDARY--\r\n";

// MIME-Ressource erstellen und Nachricht parsen
$mime = mailparse_msg_create();
mailparse_msg_parse($mime, $rawEmail);

// Alle Abschnittsnamen abrufen
$struktur = mailparse_msg_get_structure($mime);

echo "MIME-Abschnitte:\n";
foreach ($struktur as $abschnitt) {
    echo "  - " . $abschnitt . "\n";
}

// Ressource freigeben
mailparse_msg_free($mime);
?>
MIME-Abschnitte: - 1 - 1.1 - 1.2

Abschnitte analysieren und Typ ausgeben

<?php
$rawEmail = file_get_contents('/pfad/zur/email.eml');

$mime = mailparse_msg_create();
mailparse_msg_parse($mime, $rawEmail);

$abschnitte = mailparse_msg_get_structure($mime);

foreach ($abschnitte as $name) {
    // Teilressource für diesen Abschnitt holen
    $teil = mailparse_msg_get_part($mime, $name);
    $daten = mailparse_msg_get_part_data($teil);

    $contentType = $daten['content-type'] ?? 'unbekannt';
    echo "Abschnitt '{$name}': Content-Type = {$contentType}\n";
}

mailparse_msg_free($mime);
?>
Abschnitt '1': Content-Type = multipart/mixed Abschnitt '1.1': Content-Type = text/plain Abschnitt '1.2': Content-Type = text/html Abschnitt '1.3': Content-Type = application/pdf

// Wichtig · Fallstricke

PECL-Erweiterung erforderlich: mailparse_msg_get_structure() ist Teil der PECL-Erweiterung mailparse. Sie ist nicht im PHP-Kern enthalten und muss über PECL installiert oder als Systempaket (z. B. php-mailparse) bereitgestellt werden.

Ressourcen-Verwaltung: Denken Sie daran, die MIME-Ressource nach Verwendung mit mailparse_msg_free() freizugeben, um Speicherlecks zu vermeiden – besonders bei der Verarbeitung vieler E-Mails in Schleifen.

PHP 8+: Ab PHP 8.0 wurde das interne Ressourcen-Modell für viele Erweiterungen überarbeitet. Prüfen Sie die Kompatibilität Ihrer mailparse-Version mit der eingesetzten PHP-Version.