Start · Sprachen · PHP · Referenz · imap_body

imap_body

Funktion

Liest den vollständigen Textkörper (Body) einer E-Mail-Nachricht aus einem geöffneten IMAP-Postfach und gibt ihn als String zurück.

seit PHP 4.0.0 Kategorie: http

Signatur

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

Beschreibung

imap_body() ruft den rohen Nachrichteninhalt (Body) einer E-Mail ab, die über eine aktive IMAP-Verbindung erreichbar ist. Die Nachricht wird anhand ihrer Sequenznummer (oder UID, wenn das Flag FT_UID gesetzt ist) identifiziert. Der zurückgegebene Text ist der vollständige, unverarbeitete Body-Teil der Nachricht gemäß MIME-Standard – inklusive aller Teile einer mehrteiligen Nachricht (Multipart), Base64-kodierter Anhänge usw.

Für einfache Textnachrichten ohne Anhänge liefert die Funktion den Klartext direkt. Bei komplexeren MIME-Strukturen (HTML-E-Mails, Anhänge) enthält der Rückgabewert alle MIME-Teile in roher Form. In solchen Fällen ist es oft sinnvoller, imap_fetchstructure() kombiniert mit imap_fetchbody() zu verwenden, um gezielt einzelne MIME-Teile zu extrahieren.

Der Parameter $flags erlaubt es, das Verhalten der Funktion anzupassen: Mit FT_UID wird $message_num als UID statt als Sequenznummer interpretiert, mit FT_PEEK wird die Nachricht nicht als gelesen markiert, und mit FT_INTERNAL wird die Nachricht in der internen Kodierung des Servers zurückgegeben, ohne Zeilenenden zu normalisieren.

Diese Funktion ist nützlich, wenn man schnell den gesamten Body einer Nachricht benötigt, ohne auf einzelne MIME-Teile eingehen zu müssen. Für professionelle E-Mail-Verarbeitung mit Anhängen und HTML-Teilen empfiehlt sich jedoch eine strukturiertere Herangehensweise über die MIME-Parsing-Funktionen.

Parameter

Name Typ Default Beschreibung
$imap Pflicht IMAP\Connection Eine aktive IMAP-Verbindungsinstanz, wie sie von imap_open() zurückgegeben wird.
$message_num Pflicht int Die Sequenznummer der Nachricht im Postfach (beginnend bei 1) oder die UID der Nachricht, wenn das Flag FT_UID gesetzt ist.
$flags int 0 Optionale Bitmaske aus folgenden Konstanten:
  • FT_UID$message_num wird als UID interpretiert.
  • FT_PEEK – Nachricht wird nicht als gelesen markiert.
  • FT_INTERNAL – Rückgabe in interner Kodierung ohne Normalisierung der Zeilenenden (CR+LF).

Rückgabewert

Typ
string|false
Beschreibung
Gibt den rohen Body der Nachricht als string zurück. Im Fehlerfall (z. B. ungültige Nachrichtennummer oder Verbindungsproblem) wird false zurückgegeben.

Beispiele

Einfachen E-Mail-Body auslesen

<?php
// IMAP-Verbindung öffnen
$imap = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'benutzer@example.com', 'geheimesPasswort');

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

// Anzahl der Nachrichten ermitteln
$anzahl = imap_num_msg($imap);
echo "Anzahl Nachrichten: $anzahl\n";

if ($anzahl > 0) {
    // Body der ersten Nachricht abrufen (ohne als gelesen zu markieren)
    $body = imap_body($imap, 1, FT_PEEK);

    if ($body !== false) {
        echo "Body der ersten Nachricht:\n";
        echo $body;
    } else {
        echo 'Fehler beim Abrufen des Bodys: ' . imap_last_error();
    }
}

imap_close($imap);
Anzahl Nachrichten: 5 Body der ersten Nachricht: Hello World! Dies ist eine einfache Testnachricht.

Nachricht per UID abrufen und Body dekodieren

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

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

// Bekannte UID der Nachricht
$uid = 12345;

// Body per UID abrufen
$rawBody = imap_body($imap, $uid, FT_UID | FT_PEEK);

if ($rawBody !== false) {
    // Struktur der Nachricht ermitteln, um Kodierung zu bestimmen
    $struktur = imap_fetchstructure($imap, $uid, FT_UID);

    // Kodierung prüfen (3 = Base64, 4 = Quoted-Printable)
    if (isset($struktur->encoding)) {
        if ($struktur->encoding === 3) {
            $body = base64_decode($rawBody);
        } elseif ($struktur->encoding === 4) {
            $body = quoted_printable_decode($rawBody);
        } else {
            $body = $rawBody;
        }
    } else {
        $body = $rawBody;
    }

    echo htmlspecialchars($body, ENT_QUOTES, 'UTF-8');
} else {
    echo 'Nachricht nicht gefunden oder Fehler aufgetreten.';
}

imap_close($imap);

// Wichtig · Fallstricke

Achtung bei MIME-kodierten Nachrichten: imap_body() gibt den Body in seiner rohen, kodierten Form zurück. Bei Base64- oder Quoted-Printable-kodierten Inhalten muss der Rückgabewert entsprechend dekodiert werden (z. B. mit base64_decode() oder quoted_printable_decode()). Die Kodierung lässt sich über imap_fetchstructure() ermitteln.

Mehrteilige Nachrichten (Multipart): Bei E-Mails mit Anhängen oder HTML-Teilen enthält der Body alle MIME-Teile als rohen String. Für eine saubere Verarbeitung sollte in diesen Fällen imap_fetchbody() mit dem gewünschten MIME-Teil-Selektor verwendet werden.

Sicherheitshinweis: Inhalte, die aus E-Mails gelesen werden, sollten niemals ungeprüft in HTML-Ausgaben eingebettet werden. Stets htmlspecialchars() verwenden, um XSS-Angriffe zu verhindern.

Deprecation/Änderung in PHP 8.1: Ab PHP 8.1 ist der Rückgabewert von imap_open() kein resource mehr, sondern ein IMAP\Connection-Objekt. Der erste Parameter von imap_body() wurde entsprechend angepasst.