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
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()gibttruezurück, wenn mindestens ein MX-Eintrag gefunden wurde, andernfallsfalse. Die eigentlichen Daten werden in die per Referenz übergebenen arrays$mxhostsund$weightgeschrieben — 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 gibtgetmxrr()falsezurück. Gemäß SMTP-Standard kann E-Mail dennoch an denA-Eintrag des Hosts als Fallback zugestellt werden, abergetmxrr()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 vongetmxrr(); 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.