Start · Sprachen · PHP · Referenz · imap_bodystruct

imap_bodystruct

Funktion

Liest die Struktur eines bestimmten MIME-Abschnitts einer IMAP-Nachricht und gibt ein Objekt mit den Metadaten zurück.

seit PHP 4.0.0 Kategorie: http

Signatur

imap_bodystruct(IMAP\Connection $imap, int $message_num, string $section): stdClass|false

Beschreibung

imap_bodystruct() ruft die MIME-Struktur eines einzelnen Teils (Body-Section) einer E-Mail-Nachricht ab, die über eine IMAP-Verbindung erreichbar ist. Im Gegensatz zu imap_fetchstructure(), das die gesamte Nachrichtenstruktur zurückgibt, konzentriert sich diese Funktion auf einen bestimmten, bereits bekannten Abschnitt.

Der Abschnitt wird durch den Parameter section als MIME-Sektionsnummer (z. B. "1", "2", "1.1", "1.2.1") angegeben — dieselbe Notation, die auch bei imap_fetchbody() verwendet wird. Das zurückgegebene Objekt enthält Felder wie type, encoding, subtype, bytes, lines sowie gegebenenfalls parameters und Disposition-Informationen.

Die Funktion ist besonders nützlich, wenn man innerhalb einer bereits analysierten Nachrichtenstruktur gezielt Metadaten zu einem Anhang oder einem bestimmten Textteil benötigt, ohne die gesamte Struktur erneut parsen zu müssen.

Hinweis: Die IMAP-Extension setzt eine aktive IMAP\Connection voraus, die mit imap_open() geöffnet wurde. Ab PHP 8.1 wurde der Ressourcentyp durch das Objekt IMAP\Connection ersetzt.

Parameter

Name Typ Default Beschreibung
$imap Pflicht IMAP\Connection Eine aktive IMAP-Verbindung, die mit imap_open() geöffnet wurde.
$message_num Pflicht int Die Sequenznummer der Nachricht im Postfach. Entspricht der laufenden Nummer (nicht der UID) der E-Mail.
$section Pflicht string Die MIME-Sektionsnummer als Zeichenkette, z. B. "1", "2" oder "1.2". Diese Notation entspricht den IMAP-Sektionsnummern wie sie auch bei imap_fetchbody() genutzt werden.

Rückgabewert

Typ
stdClass|false
Beschreibung
Gibt ein stdClass-Objekt mit den Strukturinformationen des angegebenen MIME-Abschnitts zurück. Felder umfassen u. a. type (numerischer MIME-Haupttyp), encoding (Transferkodierung), subtype (z. B. "PLAIN", "HTML"), bytes (Größe in Bytes) und parameters (Array mit MIME-Parametern). Bei einem Fehler wird false zurückgegeben.

Beispiele

Struktur des ersten Nachrichtenteils auslesen

<?php
$imap = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'user@example.com', 'geheim');

if ($imap === false) {
    die('Verbindung fehlgeschlagen: ' . imap_last_error());
}

$messageNum = 1;
$section    = '1'; // Erster Body-Teil der Nachricht

$struct = imap_bodystruct($imap, $messageNum, $section);

if ($struct === false) {
    echo 'Struktur konnte nicht gelesen werden.';
} else {
    // type: 0 = TEXT, 1 = MULTIPART, 2 = MESSAGE, 3 = APPLICATION, ...
    echo 'MIME-Typ (numerisch): ' . $struct->type . PHP_EOL;
    echo 'Subtype: '             . $struct->subtype . PHP_EOL;
    echo 'Encoding: '            . $struct->encoding . PHP_EOL;
    echo 'Größe (Bytes): '       . $struct->bytes . PHP_EOL;
}

imap_close($imap);
MIME-Typ (numerisch): 0 Subtype: PLAIN Encoding: 0 Größe (Bytes): 342

Anhang-Informationen eines verschachtelten MIME-Abschnitts abfragen

<?php
$imap = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'user@example.com', 'geheim');

$messageNum = 3;
$section    = '2'; // Zweiter Teil — oft ein Anhang bei multipart/mixed

$struct = imap_bodystruct($imap, $messageNum, $section);

if ($struct && isset($struct->disposition)) {
    echo 'Disposition: ' . $struct->disposition . PHP_EOL; // z. B. "attachment"
}

if ($struct && !empty($struct->dparameters)) {
    foreach ($struct->dparameters as $param) {
        echo $param->attribute . ': ' . $param->value . PHP_EOL;
    }
}

// Gibt z. B. aus:
// Disposition: attachment
// FILENAME: dokument.pdf

imap_close($imap);
Disposition: attachment FILENAME: dokument.pdf

// Wichtig · Fallstricke

Deprecation: Die IMAP-Extension wurde in PHP 8.4 als veraltet markiert. Für neue Projekte empfiehlt sich der Einsatz von Bibliotheken wie ddeboer/imap oder direkter Nutzung von IMAP-Protokollbibliotheken.

Sektionsnummern: Die korrekte Sektionsnummer muss vorab bekannt sein — in der Regel durch vorherige Analyse der Gesamtstruktur mit imap_fetchstructure(). Eine falsche Sektionsangabe führt zu false.

Nachrichtennummer vs. UID: imap_bodystruct() arbeitet mit Sequenznummern, nicht mit UIDs. Bei Postfachoperationen kann sich die Sequenznummer ändern; für stabile Referenzen sollten UIDs (via imap_fetch_overview() und imap_uid()) bevorzugt werden.