Start · Sprachen · PHP · Referenz · imap_savebody

imap_savebody

Funktion

Speichert einen Teil des Nachrichtentextes (oder den gesamten Nachrichtentext) einer IMAP-Nachricht in eine Datei oder einen Stream.

seit PHP 5.1.3 Kategorie: http

Signatur

imap_savebody(IMAP\Connection $imap, string|resource $file, int $message_num, string $section = "", int $flags = 0): bool

Beschreibung

imap_savebody() liest den Nachrichtentext (oder einen bestimmten MIME-Abschnitt davon) aus einem IMAP-Postfach und schreibt ihn direkt in eine Datei oder einen bereits geöffneten Stream-Resource. Dies ist besonders nützlich, um E-Mail-Anhänge oder Nachrichteninhalte effizient zu speichern, ohne sie komplett in den Arbeitsspeicher laden zu müssen.

Der Parameter section folgt der IMAP-Abschnittsnummerierung (z. B. "1", "2", "1.1"), wie sie von imap_fetchstructure() zurückgegeben wird. Wird eine leere Zeichenkette übergeben, wird der gesamte Nachrichtentext gespeichert.

Über den Parameter flags kann das Verhalten beeinflusst werden, z. B. ob der MIME-Header mitgespeichert wird (FT_PREFETCHTEXT) oder ob die Nachricht nicht als gelesen markiert werden soll (FT_PEEK). Die Funktion eignet sich gut für die Verarbeitung großer E-Mails, da der Inhalt gestreamt statt im Speicher gepuffert wird.

  • Gibt true zurück, wenn die Operation erfolgreich war, andernfalls false.
  • Wenn file ein Dateiname (String) ist, wird die Datei zum Schreiben geöffnet; wenn es eine Resource ist, wird direkt in diesen Stream geschrieben.

Parameter

Name Typ Default Beschreibung
$imap Pflicht IMAP\Connection Eine gültige IMAP-Verbindung, die zuvor mit imap_open() geöffnet wurde.
$file Pflicht string|resource Entweder ein Dateipfad als String (wird zum Schreiben geöffnet/erzeugt) oder eine bereits geöffnete Stream-Resource (z. B. von fopen()).
$message_num Pflicht int Die Nachrichtennummer (Sequenznummer oder UID, abhängig von den flags) der zu verarbeitenden E-Mail im aktuellen Postfach.
$section string Die MIME-Abschnittsnummer nach IMAP-Standard (z. B. "1", "2", "1.2"). Eine leere Zeichenkette speichert den gesamten Nachrichtentext.
$flags int 0 Optionale Flags als Bitmask: FT_UID (message_num ist eine UID), FT_PEEK (Nachricht nicht als gelesen markieren), FT_INTERNAL (interne Kodierung, keine Normalisierung der Zeilenenden).

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. ungültige Verbindung, nicht schreibbare Datei oder ungültige Nachrichtennummer).

Beispiele

Gesamten Nachrichtentext in eine Datei speichern

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

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

$messageNum = 1; // Erste Nachricht im Postfach
$zieldatei  = '/tmp/nachricht_1.eml';

if (imap_savebody($imap, $zieldatei, $messageNum)) {
    echo "Nachricht erfolgreich gespeichert in: $zieldatei" . PHP_EOL;
} else {
    echo 'Fehler beim Speichern der Nachricht.' . PHP_EOL;
}

imap_close($imap);
?>
Nachricht erfolgreich gespeichert in: /tmp/nachricht_1.eml

Einen bestimmten MIME-Abschnitt (z. B. Anhang) in einen Stream schreiben

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

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

$messageNum = 3;
$section    = '2'; // Zweiter MIME-Abschnitt (z. B. ein Anhang)
$stream     = fopen('/tmp/anhang_aus_mail.pdf', 'wb');

if ($stream === false) {
    die('Datei konnte nicht geöffnet werden.');
}

// FT_PEEK: Nachricht nicht als gelesen markieren
if (imap_savebody($imap, $stream, $messageNum, $section, FT_PEEK)) {
    echo 'Anhang erfolgreich gespeichert.' . PHP_EOL;
} else {
    echo 'Fehler: ' . imap_last_error() . PHP_EOL;
}

fclose($stream);
imap_close($imap);
?>
Anhang erfolgreich gespeichert.

// Wichtig · Fallstricke

Vorsicht bei Dateinamen: Wenn ein Dateiname als String übergeben wird, öffnet PHP die Datei intern zum Schreiben. Achten Sie darauf, dass das Verzeichnis beschreibbar ist und keine sensiblen Daten in öffentlich zugängliche Verzeichnisse geschrieben werden.

MIME-Kodierung: Der gespeicherte Inhalt ist in der Regel noch base64- oder quoted-printable-kodiert, sofern kein FT_INTERNAL-Flag gesetzt ist. Für binäre Anhänge muss der Inhalt nach dem Speichern noch dekodiert werden, z. B. mit base64_decode().

Abschnittsnummern: Um die korrekte section zu ermitteln, sollte zuvor imap_fetchstructure() aufgerufen werden, um die MIME-Struktur der Nachricht zu analysieren.

Die IMAP-Extension und ihre Funktionen wurden in PHP 8.1 dahingehend geändert, dass imap_open() statt einer Resource nun ein IMAP\Connection-Objekt zurückgibt.