Signatur
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
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);
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);
// 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.