Signatur
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
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);
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);
// 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.