Start · Sprachen · PHP · Referenz · imap_search

imap_search

Funktion

Durchsucht ein IMAP-Postfach nach Nachrichten, die den angegebenen Suchkriterien entsprechen, und gibt ein Array mit Nachrichten-IDs zurück.

seit PHP 4.0.0 Kategorie: http

Signatur

imap_search(IMAP\Connection $imap, string $criteria, int $flags = SE_FREE, string $charset = ""): array|false

Beschreibung

imap_search() durchsucht das aktuell geöffnete IMAP-Postfach anhand von RFC3501-kompatiblen Suchkriterien. Die Funktion gibt ein Array mit Nachrichten-Nummern oder Nachrichten-UIDs zurück, die auf die Kriterien passen. Dies ermöglicht es, gezielt nach bestimmten E-Mails zu filtern – zum Beispiel nach ungelesenen Nachrichten, E-Mails eines bestimmten Absenders oder Nachrichten in einem bestimmten Datumsbereich.

Der Parameter criteria ist eine Zeichenkette, die ein oder mehrere RFC3501-Suchschlüsselwörter enthält, getrennt durch Leerzeichen. Gängige Schlüsselwörter sind unter anderem: ALL (alle Nachrichten), UNSEEN (ungelesene Nachrichten), FROM "absender@example.com", SUBJECT "Betreff", SINCE "01-Jan-2024" oder FLAGGED (markierte Nachrichten). Mehrere Kriterien können kombiniert werden, z. B. UNSEEN FROM "chef@firma.de".

Mit dem Parameter flags lässt sich steuern, ob die Rückgabe aus sequenziellen Nachrichten-Nummern (SE_FREE, Standard) oder aus UID-Werten (SE_UID) besteht. UIDs sind stabiler, da sie sich beim Löschen anderer Nachrichten nicht verschieben. Der optionale Parameter charset gibt den Zeichensatz an, der bei der Suche verwendet werden soll (z. B. UTF-8).

Die Funktion ist besonders nützlich in E-Mail-Verwaltungsanwendungen, Newsletter-Systemen oder automatisierten Mailverarbeitungs-Scripts, wo nur relevante Nachrichten selektiert und anschließend z. B. mit imap_fetchbody() oder imap_header() weiterverarbeitet werden sollen.

Parameter

Name Typ Default Beschreibung
$imap Pflicht IMAP\Connection Eine aktive IMAP-Verbindungsinstanz, wie sie von imap_open() zurückgegeben wird.
$criteria Pflicht string Suchkriterien gemäß RFC3501 als Zeichenkette, z. B. "UNSEEN", "FROM \"name@example.com\"" oder "SUBJECT \"Rechnung\" SINCE \"01-Jan-2024\"". Mehrere Bedingungen werden durch Leerzeichen kombiniert (implizites AND).
$flags int SE_FREE Steuert das Format der zurückgegebenen IDs. SE_FREE (Standard) liefert sequenzielle Nachrichten-Nummern, SE_UID liefert UIDs (stabiler bei Postfachoperationen).
$charset string "" Der MIME-Zeichensatz, der bei der Suche verwendet wird, z. B. "UTF-8". Wird ein leerer String übergeben, verwendet der Server seinen Standardzeichensatz.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein Array mit Nachrichten-Nummern (oder UIDs bei SE_UID) zurück, die den Suchkriterien entsprechen. Wurden keine Nachrichten gefunden oder tritt ein Fehler auf, wird false zurückgegeben.

Beispiele

Alle ungelesenen Nachrichten abrufen

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

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

$ungelesen = imap_search($imap, 'UNSEEN');

if ($ungelesen) {
    echo 'Ungelesene Nachrichten: ' . count($ungelesen) . PHP_EOL;
    foreach ($ungelesen as $msgNr) {
        $header = imap_headerinfo($imap, $msgNr);
        echo 'Von: ' . $header->fromaddress . ' | Betreff: ' . $header->subject . PHP_EOL;
    }
} else {
    echo 'Keine ungelesenen Nachrichten gefunden.';
}

imap_close($imap);
Ungelesene Nachrichten: 3 Von: chef@firma.de | Betreff: Meetingeinladung Von: info@shop.de | Betreff: Ihre Bestellung Von: noreply@service.com | Betreff: Passwort zurücksetzen

Kombinierte Suche: Nachrichten eines Absenders seit einem Datum (mit UIDs)

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

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

// UIDs abrufen für stabilen Zugriff
$uids = imap_search($imap, 'FROM "rechnungen@lieferant.de" SINCE "01-Jan-2024"', SE_UID);

if ($uids) {
    foreach ($uids as $uid) {
        // Nachrichtentext per UID abrufen
        $body = imap_fetchbody($imap, $uid, '1', FT_UID);
        echo "UID $uid – Nachrichteninhalt (gekürzt): " . mb_substr($body, 0, 100) . PHP_EOL;
    }
} else {
    echo 'Keine passenden Nachrichten gefunden.';
}

imap_close($imap);
UID 1042 – Nachrichteninhalt (gekürzt): Sehr geehrte Damen und Herren, anbei erhalten Sie Ihre Rechnung für den Monat Januar 2024... UID 1087 – Nachrichteninhalt (gekürzt): Sehr geehrte Damen und Herren, anbei erhalten Sie Ihre Rechnung für den Monat Februar 2024...

// Wichtig · Fallstricke

Erweiterungsvoraussetzung: Die IMAP-Erweiterung muss in PHP aktiviert sein (ext-imap). Ab PHP 8.1 sind IMAP-Verbindungen Objekte vom Typ IMAP\Connection statt Ressourcen.

Sonderzeichen in Kriterien: Suchbegriffe wie Absender-Adressen oder Betreffzeilen müssen in doppelte Anführungszeichen eingeschlossen werden. Bei der Verwendung in PHP-Strings müssen diese entsprechend escapt werden (FROM "name"'FROM "name"' oder "FROM \"name\"").

Zeichensatz-Kompatibilität: Nicht alle IMAP-Server unterstützen den Parameter charset vollständig. Bei der Suche nach Nachrichten mit Umlauten oder anderen Nicht-ASCII-Zeichen sollte UTF-8 angegeben werden, jedoch kann das Verhalten je nach Mailserver variieren.

Große Postfächer: Bei sehr großen Postfächern kann imap_search() langsam sein. Es empfiehlt sich, die Suche durch Ordnerauswahl und möglichst enge Kriterien zu begrenzen. Die Verwendung von UIDs (SE_UID) ist für robuste Anwendungen zu bevorzugen, da sequenzielle Nummern sich nach dem Löschen von Nachrichten verschieben können.