W3docs

PHP getmxrr()-Funktion: Alles, was Sie wissen müssen

Als PHP-Entwickler müssen Sie möglicherweise MX-Einträge für einen Domainnamen abrufen. Die Funktion getmxrr() war dafür historisch vorgesehen.

Als PHP-Entwickler müssen Sie möglicherweise die Mail-Exchange-Einträge (MX) für einen bestimmten Domainnamen abrufen. In solchen Szenarien wurde die Funktion getmxrr() historisch eingesetzt. Wichtig: getmxrr() wurde in PHP 8.2 als veraltet markiert und in PHP 8.4 entfernt. Für moderne PHP-Anwendungen verwenden Sie stattdessen dns_get_record(). Dieser Artikel erläutert die Legacy-Funktion für die Wartung älterer Codebasen.

Was ist die getmxrr()-Funktion?

Die Funktion getmxrr() führt eine DNS-Abfrage für einen angegebenen Domainnamen durch und gibt ein array aller zugehörigen MX-Einträge zurück. Sie erfordert, dass die dns-Erweiterung in Ihrer PHP-Umgebung aktiviert ist. Die Funktion gibt bei Erfolg true und bei Misserfolg false zurück.

Verwendung der getmxrr()-Funktion

Die Verwendung der Funktion getmxrr() ist unkompliziert. Hier ist die Syntax der Funktion:

Die PHP-Syntax der getmxrr()-Funktion

getmxrr($hostname, &$mxhosts, &$weight);

Die Funktion nimmt drei Parameter entgegen:

  • $hostname: Der Domainname, für den Sie die MX-Einträge abrufen möchten.
  • $mxhosts: Eine Referenz auf ein array, das die MX-Hosts für den Domainnamen speichert. (Hinweis: In PHP 5.3+ ist das Symbol & nur in der Funktionssignatur erforderlich, nicht beim Aufruf der Funktion.)
  • $weight: Eine Referenz auf ein array, das die Prioritätsgewichtungen der MX-Hosts speichert.

Hier ist ein Beispiel, wie die Funktion getmxrr() verwendet wird, um die MX-Einträge für einen Domainnamen abzurufen:

Verwendung der getmxrr()-Funktion

php— editable, runs on the server

In diesem Beispiel rufen wir die MX-Einträge für den Domainnamen „example.com" ab. Die Funktion führt eine DNS-Abfrage durch und befüllt die arrays $mxhosts und $weight. Anschließend durchlaufen wir die arrays und geben die MX-Hosts und ihre Gewichtungen aus. Wenn die Abfrage fehlschlägt, behandelt der else-Block den Fehler entsprechend.

Verstehen von MX-Gewichtungen (Priorität)

Jeder MX-Eintrag hat eine Gewichtung (auch als Priorität oder Präferenz bezeichnet). Wenn ein Mailserver eine E-Mail zustellt, versucht er zuerst den Host mit der niedrigsten Gewichtung; höhere Gewichtungen fungieren als Fallbacks. Ein Eintrag mit der Gewichtung 10 wird daher einem mit der Gewichtung 20 vorgezogen.

getmxrr() sortiert die Ergebnisse nicht für Sie — die Einträge werden in der Reihenfolge zurückgegeben, in der der DNS-Resolver sie liefert. Wenn Sie sie in Zustellungsreihenfolge benötigen, sortieren Sie selbst nach Gewichtung. Da $mxhosts und $weight parallele arrays sind (Index 0 des einen entspricht Index 0 des anderen), ist es am saubersten, sie zunächst zu kombinieren, um die Zuordnung beim Sortieren beizubehalten:

<?php

$hostname = "example.com";
$mxhosts = [];
$weight = [];

if (getmxrr($hostname, $mxhosts, $weight)) {
  // Pair each host with its weight, then sort by weight ascending.
  $records = array_map(fn($host, $w) => ['host' => $host, 'weight' => $w], $mxhosts, $weight);
  usort($records, fn($a, $b) => $a['weight'] <=> $b['weight']);

  foreach ($records as $record) {
    echo "Priority {$record['weight']}: {$record['host']}\n";
  }
} else {
  echo "No MX record found for $hostname";
}

Die Schleife gibt nun den bevorzugten Mailserver zuerst aus.

Rückgabewert und häufige Fallstricke

  • Der Rückgabetyp ist boolean. getmxrr() gibt true zurück, wenn mindestens ein MX-Eintrag gefunden wurde, andernfalls false. Die eigentlichen Daten werden in die per Referenz übergebenen arrays $mxhosts und $weight geschrieben — nicht zurückgegeben.
  • Kein MX-Eintrag ist nicht dasselbe wie keine Domain. Eine Domain kann auflösbar sein (einen A-Eintrag haben), aber keine MX-Einträge besitzen. In diesem Fall gibt getmxrr() false zurück. Gemäß SMTP-Standard kann E-Mail dennoch an den A-Eintrag des Hosts als Fallback zugestellt werden, aber getmxrr() teilt Ihnen das nicht mit.
  • Abschließende Punkte. Zurückgegebene Hostnamen können einen abschließenden Punkt enthalten (z. B. mail.example.com.). Entfernen Sie ihn bei Stringvergleichen: rtrim($host, '.').
  • Erfordert die dns-Erweiterung. Bei den meisten Builds ist diese standardmäßig einkompiliert, aber minimale oder gehärtete Umgebungen können sie deaktivieren.

Der moderne Ersatz: dns_get_record()

Da getmxrr() in PHP 8.4 entfernt wurde, sollte neuer Code dns_get_record() mit dem Flag DNS_MX verwenden. Es gibt ein einziges, reichhaltigeres array anstelle von zwei parallelen zurück:

<?php

$hostname = "example.com";
$records = dns_get_record($hostname, DNS_MX);

if ($records) {
  // Sort by the 'pri' (priority/weight) field, lowest first.
  usort($records, fn($a, $b) => $a['pri'] <=> $b['pri']);

  foreach ($records as $record) {
    echo "Priority {$record['pri']}: {$record['target']}\n";
  }
} else {
  echo "No MX record found for $hostname";
}

Jedes Element ist hier ein assoziatives array mit Schlüsseln wie host, type, pri und target, sodass Sie keine zwei arrays synchron verwalten müssen. Dies ist der empfohlene Ansatz für alle PHP 8.x-Projekte.

Verwandte Funktionen

  • dns_get_record() — die moderne, vollständig unterstützte Methode zum Lesen beliebiger DNS-Eintragstypen, einschließlich MX.
  • dns_get_mx() — der prozedurale Alias von getmxrr(); gleiches Verhalten, gleiche Veraltungsmarkierung.
  • checkdnsrr() — prüft, ob DNS-Einträge eines bestimmten Typs für einen Host vorhanden sind.
  • gethostbyname() — löst einen Hostnamen in seinen IPv4-A-Eintrag auf.

Fazit

Die Funktion getmxrr() ist ein Legacy-Werkzeug zum Abrufen von MX-Einträgen in älteren PHP-Versionen. Durch das Verständnis ihrer Syntax und ihres Verhaltens können Sie die Kompatibilität mit Legacy-Codebasen aufrechterhalten. Für neue Projekte empfehlen wir stattdessen dns_get_record() mit dem Typflag DNS_MX zu verwenden. Wir hoffen, dass dieser Artikel für die Arbeit mit historischen PHP-DNS-Funktionen informativ war.

Übungen

Übung
Was ist die Aufgabe der getmxrr()-Funktion in PHP?
Was ist die Aufgabe der getmxrr()-Funktion in PHP?
Was this page helpful?