Start · Sprachen · PHP · Referenz · imap_mail_move

imap_mail_move

Funktion

Verschiebt eine oder mehrere Nachrichten in ein anderes IMAP-Postfach und markiert sie im Quell-Postfach zum Löschen.

seit PHP 4.0.0 Kategorie: http

Signatur

imap_mail_move(IMAP\Connection $imap, string $message_nums, string $mailbox, int $flags = 0): bool

Beschreibung

imap_mail_move() verschiebt Nachrichten, die durch die Nachrichtennummern-Sequenz $message_nums angegeben werden, in das Ziel-Postfach $mailbox. Die Funktion kopiert die Nachrichten intern in das Ziel-Postfach und markiert die Originale im Quell-Postfach mit dem \\Deleted-Flag. Um den Vorgang abzuschließen und die markierten Nachrichten tatsächlich zu entfernen, muss anschließend imap_expunge() aufgerufen werden.

Die Nachrichtennummern in $message_nums können als einzelne Nummer ('1'), kommagetrennte Liste ('1,3,5') oder als Bereich ('1:5') übergeben werden. Standardmäßig werden dabei Sequenznummern verwendet; mit dem Flag CP_UID kann stattdessen mit UIDs gearbeitet werden, was stabiler ist, da UIDs sich beim Hinzufügen neuer Nachrichten nicht verschieben.

Diese Funktion ist nützlich, wenn Nachrichten in einem IMAP-Konto organisiert werden sollen, zum Beispiel beim automatischen Einsortieren von E-Mails in Ordner, beim Archivieren gelesener Nachrichten oder beim Bereinigen des Posteingangs. Sie ist Teil der IMAP-Erweiterung, die mit der PHP-Option --with-imap aktiviert werden muss.

Hinweis: Ab PHP 8.1.0 ist der erste Parameter vom Typ IMAP\Connection statt der zuvor verwendeten Ressource.

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 Nachrichtennummern-Sequenz als String. Einzelne Nummer ('3'), kommagetrennte Liste ('1,3,7') oder Bereich ('1:10'). Wenn das Flag CP_UID gesetzt ist, werden UIDs erwartet.
$mailbox Pflicht string Name des Ziel-Postfachs (Ordners) auf dem IMAP-Server, z. B. 'INBOX.Archiv' oder 'Gelöscht'. Der Ordner muss auf dem Server existieren.
$flags int 0 Optionale Flags. Mit CP_UID werden die Angaben in $message_nums als UIDs interpretiert statt als Sequenznummern.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn das Ziel-Postfach nicht existiert oder die Verbindung unterbrochen ist).

Beispiele

Einzelne Nachricht in Archiv-Ordner verschieben

<?php
// IMAP-Verbindung ö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 in den Ordner 'Archiv' verschieben
$result = imap_mail_move($imap, '3', 'Archiv');

if ($result) {
    // Zum Löschen markierte Nachrichten endgültig entfernen
    imap_expunge($imap);
    echo 'Nachricht erfolgreich verschoben.';
} else {
    echo 'Fehler beim Verschieben: ' . imap_last_error();
}

imap_close($imap);
Nachricht erfolgreich verschoben.

Mehrere Nachrichten per UID in einen Unterordner verschieben

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

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

// Alle Nachrichten suchen, die älter als 30 Tage sind
$dreissigTageAlt = date('d-M-Y', strtotime('-30 days'));
$uids = imap_search($imap, 'BEFORE ' . $dreissigTageAlt, SE_UID);

if ($uids) {
    $uidListe = implode(',', $uids);

    // Nachrichten per UID in 'INBOX.Alt' verschieben
    if (imap_mail_move($imap, $uidListe, 'INBOX.Alt', CP_UID)) {
        imap_expunge($imap);
        echo count($uids) . ' alte Nachrichten archiviert.';
    } else {
        echo 'Fehler: ' . imap_last_error();
    }
} else {
    echo 'Keine alten Nachrichten gefunden.';
}

imap_close($imap);
15 alte Nachrichten archiviert.

// Wichtig · Fallstricke

Expunge nicht vergessen: imap_mail_move() markiert die Quelldateien nur mit \\Deleted. Ohne nachfolgendes imap_expunge() oder imap_close($imap, CL_EXPUNGE) bleiben die Originale im Quell-Postfach sichtbar.

Ziel-Ordner muss existieren: Wenn der Zielordner auf dem Server nicht vorhanden ist, schlägt die Funktion fehl. Mit imap_createmailbox() kann ein fehlender Ordner vorab angelegt werden.

Sequenznummern vs. UIDs: Sequenznummern können sich ändern, wenn Nachrichten hinzugefügt oder gelöscht werden. Für robusteren Code empfiehlt sich die Verwendung von UIDs zusammen mit dem Flag CP_UID.

Erweiterung: Die IMAP-Erweiterung ist nicht standardmäßig aktiviert und muss beim Kompilieren von PHP oder über eine Distribution aktiviert werden. Für moderne Projekte kann imap_mail_move() durch spezialisierte Bibliotheken wie phpmailer/phpmailer oder ddeboer/imap ersetzt werden.