Signatur
Beschreibung
imap_thread() gibt die Nachrichten des aktuell geöffneten IMAP-Postfachs strukturiert als Thread-Baum zurück. Dabei werden zusammengehörende Nachrichten – also Antworten auf eine ursprüngliche Nachricht – als verknüpfte Struktur dargestellt. Dies entspricht dem IMAP-Befehl THREAD=REFERENCES, der vom Server unterstützt werden muss.
Der Rückgabewert ist ein assoziatives Array mit numerischen Schlüsseln. Jede Nachricht ist durch drei Einträge repräsentiert: XX.num (Nachrichtennummer), XX.next (nächste Nachricht auf derselben Ebene) und XX.branch (erste Nachricht eines untergeordneten Zweigs). Über diese drei Felder lässt sich der gesamte Thread-Baum traversieren.
Die Funktion ist besonders nützlich für E-Mail-Clients oder Webmail-Anwendungen, die Nachrichten geordnet nach Gesprächssträngen anzeigen sollen. So können Nutzer den Kontext einer Konversation auf einen Blick erfassen.
Zu beachten ist, dass nicht alle IMAP-Server das Threading unterstützen. Außerdem muss die IMAP-Erweiterung (ext-imap) in PHP aktiviert sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $imap Pflicht | IMAP\Connection | Eine gültige IMAP-Verbindungsressource, wie sie von imap_open() zurückgegeben wird. Ab PHP 8.1 ist der Typ IMAP\Connection statt der bisherigen Ressource zu verwenden. |
|
| $flags | int | SE_FREE | Optionale Flags, die das Verhalten der Suche steuern. Mögliche Werte sind z. B. SE_FREE (Standard), SE_UID (gibt UIDs statt Nachrichtennummern zurück) oder SE_NOPREFETCH. |
Rückgabewert
XX.num, XX.next und XX.branch repräsentiert (wobei XX ein fortlaufender Index ist). Im Fehlerfall wird false zurückgegeben.Beispiele
Thread-Baum eines IMAP-Postfachs ausgeben
<?php
// IMAP-Verbindung öffnen
$imap = imap_open("{imap.example.com:993/imap/ssl}INBOX", "user@example.com", "geheim");
if (!$imap) {
die('Verbindung fehlgeschlagen: ' . imap_last_error());
}
// Thread-Baum abrufen
$threads = imap_thread($imap);
if ($threads === false) {
echo 'Threads konnten nicht geladen werden.';
} else {
// Alle Thread-Einträge ausgeben
foreach ($threads as $key => $value) {
echo $key . ' => ' . $value . PHP_EOL;
}
}
imap_close($imap);
Thread-Baum rekursiv traversieren und anzeigen
<?php
function printThread(array $threads, int $index, int $depth = 0): void {
while ($index > 0) {
$prefix = str_repeat(' ', $depth);
$msgNum = $threads[$index . '.num'];
echo $prefix . '- Nachricht #' . $msgNum . PHP_EOL;
// Unterthreads (Antworten) verarbeiten
if (!empty($threads[$index . '.branch'])) {
printThread($threads, $threads[$index . '.branch'], $depth + 1);
}
// Nächste Nachricht auf derselben Ebene
$index = $threads[$index . '.next'] ?? 0;
}
}
$imap = imap_open("{imap.example.com:993/imap/ssl}INBOX", "user@example.com", "geheim");
if ($imap) {
$threads = imap_thread($imap);
if ($threads !== false) {
// Thread-Baum ab Index 1 traversieren
printThread($threads, 1);
}
imap_close($imap);
}
// Wichtig · Fallstricke
Serverunterstützung: Nicht alle IMAP-Server unterstützen die Threading-Erweiterung (THREAD=REFERENCES). Ist die Funktion auf dem Server nicht verfügbar, gibt imap_thread() false zurück. Es empfiehlt sich, die Capabilities des Servers vorab mit imap_getmailboxes() oder imap_last_error() zu prüfen.
Deprecation: Ab PHP 8.1 wurde die IMAP-Erweiterung als deprecated candidate markiert und in PECL ausgelagert. In zukünftigen PHP-Versionen ist sie möglicherweise nicht mehr im Kern enthalten. Für neue Projekte sollten alternative Bibliotheken wie ddeboer/imap oder Symfony Mailer in Betracht gezogen werden.
Verbindungssicherheit: Anmeldedaten (Benutzername und Passwort) sollten niemals im Quellcode hart codiert werden. Verwende stattdessen Umgebungsvariablen oder verschlüsselte Konfigurationsdateien.