Start · Sprachen · PHP · Referenz · imap_msgno

imap_msgno

Funktion

Gibt die sequentielle Nachrichtennummer für eine gegebene eindeutige Nachrichten-UID (UID) im IMAP-Postfach zurück.

seit PHP 4.0.0 Kategorie: http

Signatur

imap_msgno(IMAP\Connection $imap, int $message_uid): int

Beschreibung

imap_msgno() konvertiert eine IMAP-Nachrichten-UID (Unique Identifier) in die entsprechende sequentielle Nachrichtennummer im aktuell geöffneten Postfach. UIDs sind dauerhaft eindeutige Kennzeichner für Nachrichten, die sich auch nach Reorganisationen des Postfachs nicht ändern, während sequentielle Nummern bei jeder Sitzung variieren können.

Die Funktion ist besonders nützlich, wenn man UIDs (z. B. aus einer Datenbank oder einer vorherigen Sitzung) gespeichert hat und diese nun für Operationen benötigt, die sequentielle Nachrichtennummern erwarten – etwa imap_fetchheader() oder imap_body().

Der umgekehrte Weg – also die sequentielle Nummer in eine UID umzuwandeln – ist über imap_uid() möglich. Beide Funktionen ergänzen sich und bilden die Brücke zwischen den beiden Adressierungsarten im IMAP-Protokoll.

Zu beachten ist, dass UIDs sitzungsübergreifend stabil sind, sequentielle Nummern hingegen nicht. Daher empfiehlt es sich für persistente Referenzen auf Nachrichten immer, UIDs zu speichern und bei Bedarf mit imap_msgno() in sequentielle Nummern umzuwandeln.

Parameter

Name Typ Default Beschreibung
$imap Pflicht IMAP\Connection Eine aktive IMAP-Verbindungsinstanz, die mit imap_open() erzeugt wurde.
$message_uid Pflicht int Die eindeutige UID der Nachricht, deren sequentielle Nachrichtennummer ermittelt werden soll.

Rückgabewert

Typ
int
Beschreibung
Gibt die sequentielle Nachrichtennummer zurück, die der angegebenen UID entspricht. Ist die UID ungültig oder existiert keine entsprechende Nachricht, wird 0 zurückgegeben.

Beispiele

Nachrichtennummer aus gespeicherter UID ermitteln

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

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

// Gespeicherte UID (z. B. aus einer Datenbank)
$gespeicherteUid = 12345;

// UID in sequentielle Nachrichtennummer umwandeln
$msgno = imap_msgno($imap, $gespeicherteUid);

if ($msgno > 0) {
    // Betreff der Nachricht anhand der sequentiellen Nummer abrufen
    $header = imap_headerinfo($imap, $msgno);
    echo 'Betreff: ' . $header->subject . PHP_EOL;
} else {
    echo 'Nachricht mit UID ' . $gespeicherteUid . ' nicht gefunden.' . PHP_EOL;
}

imap_close($imap);
Betreff: Willkommen bei unserem Service

Alle UIDs auflisten und sequentielle Nummern zuordnen

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

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

// Alle Nachrichten-UIDs abrufen
$uids = imap_search($imap, 'ALL', SE_UID);

if ($uids) {
    foreach ($uids as $uid) {
        $msgno = imap_msgno($imap, $uid);
        $header = imap_headerinfo($imap, $msgno);
        echo "UID: $uid => Msg-Nr: $msgno, Betreff: {$header->subject}" . PHP_EOL;
    }
} else {
    echo 'Keine Nachrichten gefunden.' . PHP_EOL;
}

imap_close($imap);
UID: 12345 => Msg-Nr: 1, Betreff: Willkommen bei unserem Service UID: 12346 => Msg-Nr: 2, Betreff: Ihre Rechnung vom Oktober

// Wichtig · Fallstricke

Stabilität von Nummern: Sequentielle Nachrichtennummern können sich ändern, wenn Nachrichten gelöscht und das Postfach reorganisiert wird. UIDs bleiben hingegen innerhalb einer IMAP-UIDVALIDITY-Gültigkeit stabil. Speichern Sie daher immer die UID für persistente Referenzen.

UIDVALIDITY: Sollte sich der UIDVALIDITY-Wert des Postfachs geändert haben (z. B. nach einer Server-Migration), sind alle gespeicherten UIDs ungültig. Überprüfen Sie bei sitzungsübergreifender Nutzung stets den aktuellen UIDVALIDITY-Wert über imap_status().

PHP 8.1: Ab PHP 8.1 ist der Rückgabewert von imap_open() nicht mehr eine Ressource, sondern ein IMAP\Connection-Objekt. Älterer Code, der auf resource prüft, muss entsprechend angepasst werden.