Signatur
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
truezurück, wenn die Operation erfolgreich war, andernfallsfalse. - Wenn
fileein 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
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);
?>
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);
?>
// 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.