Start · Sprachen · PHP · Referenz · imap_fetchbody

imap_fetchbody

Funktion

Liefert einen bestimmten Abschnitt (Sektion) aus dem Textkörper einer IMAP-Nachricht als Zeichenkette zurück.

seit PHP 4.0.0 Kategorie: http

Signatur

imap_fetchbody(IMAP\Connection $imap, int $message_num, string $section, int $flags = 0): string|false

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_UIDmessage_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

Typ
string|false
Beschreibung
Gibt den Inhalt des angeforderten Nachrichtenabschnitts als Zeichenkette zurück. Im Fehlerfall (z. B. ungültige Verbindung oder Nachrichtennummer) wird 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);
?>
Anhang gespeichert: rechnung.pdf

// 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.