Start · Sprachen · PHP · Referenz · imap_thread

imap_thread

Funktion

Liefert die Nachrichten eines IMAP-Postfachs als Baum zusammenhängender Themenstränge (Threads).

seit PHP 4.0.7 Kategorie: http

Signatur

imap_thread(IMAP\Connection $imap, int $flags = SE_FREE): array|false

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

Typ
array|false
Beschreibung
Gibt ein assoziatives Array zurück, das den Thread-Baum beschreibt. Jede Nachricht ist durch die Schlüssel 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);
1.num => 1 1.next => 4 1.branch => 2 2.num => 2 2.next => 3 2.branch => 0 3.num => 3 3.next => 0 3.branch => 0 4.num => 4 ...

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);
}
- Nachricht #1 - Nachricht #2 - Nachricht #3 - Nachricht #4 - Nachricht #5

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