Signatur
Beschreibung
imap_fetchbody() ruft einen definierten Teil des Nachrichtenkörpers einer E-Mail über eine aktive IMAP-Verbindung ab. Der gewünschte Abschnitt wird über den Parameter section angegeben, der dem MIME-Teilpfad entspricht – z. B. "1" für den ersten Textteil oder "1.2" für den zweiten verschachtelten Teil der ersten MIME-Sektion.
Die Funktion ist besonders nützlich, wenn mehrteilige Nachrichten (Multipart-MIME) verarbeitet werden müssen und nur einzelne Teile – etwa der Klartext-Body, der HTML-Teil oder ein Anhang – gezielt gelesen werden sollen, ohne die gesamte Nachricht zu übertragen. Die Sektionsnummern können zuvor mit imap_fetchstructure() ermittelt werden.
Der zurückgegebene Inhalt ist standardmäßig in seiner ursprünglichen Kodierung (z. B. Base64 oder Quoted-Printable). Mit dem Flag FT_PEEK kann verhindert werden, dass die Nachricht als gelesen markiert wird. Mit FT_INTERNAL werden CRLF-Zeilenenden nicht in LF konvertiert.
Beachte, dass die IMAP-Erweiterung seit PHP 8.1 durch das IMAP\Connection-Objekt und nicht mehr durch eine Ressource repräsentiert wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $imap Pflicht | IMAP\Connection | Eine aktive IMAP-Verbindung, die zuvor mit imap_open() geöffnet wurde. |
|
| $message_num Pflicht | int | Die Nachrichtennummer (Sequenznummer) oder UID der E-Mail im Postfach. Bei Verwendung von UIDs muss das Flag FT_UID gesetzt sein. |
|
| $section Pflicht | string | Die MIME-Sektionsnummer als Zeichenkette, z. B. "1", "2", "1.1" oder "1.2". Eine leere Zeichenkette liefert den gesamten Nachrichtenkörper. |
|
| $flags | int | 0 | Optionale Bit-Flags: FT_UID – message_num wird als UID interpretiert; FT_PEEK – Nachricht wird nicht als gelesen markiert; FT_INTERNAL – Rückgabe mit originalen CRLF-Zeilenenden ohne Konvertierung. |
Rückgabewert
false zurückgegeben.Beispiele
Ersten Textteil einer E-Mail abrufen
<?php
$imap = imap_open('{mail.example.com:993/imap/ssl}INBOX', 'user@example.com', 'geheim');
if (!$imap) {
die('Verbindung fehlgeschlagen: ' . imap_last_error());
}
// Ersten Body-Abschnitt der Nachricht Nr. 1 abrufen
$body = imap_fetchbody($imap, 1, '1');
if ($body !== false) {
// Eventuell Base64-kodiert – dekodieren
echo base64_decode($body);
} else {
echo 'Fehler beim Abrufen des Nachrichtenkörpers.';
}
imap_close($imap);
?>
Anhang einer mehrteiligen MIME-Nachricht abrufen und speichern
<?php
$imap = imap_open('{mail.example.com:993/imap/ssl}INBOX', 'user@example.com', 'geheim');
$msgNum = 3;
$structure = imap_fetchstructure($imap, $msgNum);
if (isset($structure->parts)) {
foreach ($structure->parts as $index => $part) {
$sectionNum = (string)($index + 1);
// Anhänge erkennen (Disposition: attachment)
if (isset($part->disposition) && strtolower($part->disposition) === 'attachment') {
$data = imap_fetchbody($imap, $msgNum, $sectionNum, FT_PEEK);
// Encoding 3 = Base64
if ($part->encoding === 3) {
$data = base64_decode($data);
}
// Encoding 4 = Quoted-Printable
elseif ($part->encoding === 4) {
$data = quoted_printable_decode($data);
}
$filename = $part->dparameters[0]->value ?? 'anhang_' . $sectionNum;
file_put_contents('/tmp/' . basename($filename), $data);
echo "Anhang gespeichert: {$filename}\n";
}
}
}
imap_close($imap);
?>
// Wichtig · Fallstricke
Kodierung beachten: Der von imap_fetchbody() zurückgegebene Inhalt ist nicht automatisch dekodiert. Je nach MIME-Kodierung (encoding-Eigenschaft aus imap_fetchstructure()) muss der Inhalt noch mit base64_decode(), quoted_printable_decode() oder imap_utf8() weiterverarbeitet werden.
FT_PEEK verwenden: Ohne das Flag FT_PEEK wird die Nachricht durch das Abrufen als gelesen markiert. Für lesende Zugriffe ohne Statusänderung empfiehlt sich daher der Einsatz dieses Flags.
Sektionsnummern ermitteln: Die korrekten Sektionsnummern sollten stets über imap_fetchstructure() ermittelt werden, da die MIME-Struktur je nach Nachricht variiert.
Deprecation: Die IMAP-Erweiterung wird nicht mehr aktiv weiterentwickelt. Für neue Projekte empfiehlt sich der Einsatz moderner Bibliotheken wie Symfony Mailer oder PHPMailer in Kombination mit IMAP-Bibliotheken wie Fetch.