Start · Sprachen · PHP · Referenz · imap_delete

imap_delete

Funktion

Markiert eine oder mehrere Nachrichten im aktuellen IMAP-Postfach zum Löschen (wird erst nach <code>imap_expunge()</code> endgültig entfernt).

seit PHP 4.0.0 Kategorie: http

Signatur

imap_delete(IMAP\Connection $imap, string $message_nums, int $flags = 0): true

Beschreibung

imap_delete() setzt das \Deleted-Flag auf die angegebene(n) Nachricht(en) im aktuell geöffneten IMAP-Postfach. Die Nachrichten werden dabei nicht sofort physisch gelöscht, sondern lediglich als gelöscht markiert. Das endgültige Entfernen erfolgt erst durch einen anschließenden Aufruf von imap_expunge() oder beim Schließen der Verbindung mit imap_close(), wenn das Flag CL_EXPUNGE übergeben wird.

Der Parameter message_nums akzeptiert eine einzelne Nachrichtennummer oder eine durch Kommas getrennte Sequenz, z. B. '1,2,5', bzw. einen Bereich wie '1:5'. Die Angaben beziehen sich standardmäßig auf die interne Nachrichtennummer (Sequenznummer); mit dem Flag FT_UID kann stattdessen die UID der Nachricht verwendet werden.

Diese zweistufige Vorgehensweise (Markieren + Expunge) entspricht dem IMAP-Protokoll und gibt dem Nutzer die Möglichkeit, das Löschen vor dem Expunge noch rückgängig zu machen, indem das Flag wieder entfernt wird (z. B. mit imap_setflag_full() bzw. imap_clearflag_full()).

Typische Anwendungsfälle sind das Aufräumen von Postfächern, das automatische Archivieren alter E-Mails oder das Entfernen verarbeiteter Nachrichten in Mail-Verarbeitungs-Skripten.

Parameter

Name Typ Default Beschreibung
$imap Pflicht IMAP\Connection Eine aktive IMAP-Verbindung, die zuvor mit imap_open() geöffnet wurde.
$message_nums Pflicht string Nachrichtennummer(n) als String: eine einzelne Nummer ('3'), eine kommagetrennte Liste ('1,3,5') oder ein Bereich ('1:10'). Mit dem Flag FT_UID werden diese Werte als UIDs interpretiert.
$flags int 0 Optionale Flags. Aktuell wird nur FT_UID unterstützt, das bewirkt, dass message_nums als UID-Angabe statt als Sequenznummer interpretiert wird.

Rückgabewert

Typ
true
Beschreibung
Gibt immer true zurück. Seit PHP 8.0 ist der Rückgabetyp explizit true (zuvor war es bool, aber die Funktion gibt faktisch immer true zurück oder wirft bei einem Fehler eine Warnung).

Beispiele

Einzelne Nachricht löschen und sofort bereinigen

<?php
// Verbindung zum IMAP-Server öffnen
$imap = imap_open('{imap.example.com:993/imap/ssl}INBOX', 'user@example.com', 'geheim');

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

// Nachricht mit Sequenznummer 3 zum Löschen markieren
imap_delete($imap, '3');

// Markierte Nachrichten endgültig löschen (Expunge)
imap_expunge($imap);

echo "Nachricht 3 wurde gelöscht.\n";

imap_close($imap);
Nachricht 3 wurde gelöscht.

Mehrere Nachrichten per UID löschen und beim Schließen bereinigen

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

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

// Nachrichten-UIDs 101, 102 und 105 zum Löschen markieren
imap_delete($imap, '101,102,105', FT_UID);

// CL_EXPUNGE sorgt dafür, dass beim Schließen automatisch expunged wird
imap_close($imap, CL_EXPUNGE);

echo "Nachrichten wurden markiert und beim Schließen entfernt.\n";
Nachrichten wurden markiert und beim Schließen entfernt.

Alte Nachrichten automatisch aufräumen

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

// Suche alle Nachrichten, die älter als 30 Tage sind
$cutoff = date('d-M-Y', strtotime('-30 days'));
$alte_nachrichten = imap_search($imap, 'BEFORE ' . $cutoff);

if ($alte_nachrichten) {
    // Sequenznummern als kommagetrennte Liste zusammenführen
    $nummern = implode(',', $alte_nachrichten);
    imap_delete($imap, $nummern);
    imap_expunge($imap);
    echo count($alte_nachrichten) . ' alte Nachrichten gelöscht.\n';
} else {
    echo 'Keine alten Nachrichten gefunden.\n';
}

imap_close($imap);
12 alte Nachrichten gelöscht.

// Wichtig · Fallstricke

Wichtig: imap_delete() löscht Nachrichten nicht sofort — ohne anschließenden Aufruf von imap_expunge() oder die Verwendung von CL_EXPUNGE in imap_close() bleiben die Nachrichten trotz Markierung im Postfach erhalten.

Bei POP3-Verbindungen kann das Verhalten abweichen: Hier wird das Löschen beim Schließen der Verbindung automatisch durchgeführt, sofern keine besondere Server-Konfiguration dies verhindert.

Seit PHP 8.1 ist die IMAP-Erweiterung nicht mehr im Standard-Bundle enthalten und muss separat installiert werden (pecl install imap oder über das Paket-System des Betriebssystems). Der Verbindungsparameter hat seit PHP 8.1 den Typ IMAP\Connection statt resource.

Sequenznummern können sich ändern, wenn andere Clients gleichzeitig Nachrichten im Postfach manipulieren. Bei nebenläufigen Zugriffen empfiehlt sich daher die Verwendung von UIDs (FT_UID), die stabil bleiben.