Fonction PHP getmxrr() : Tout ce que vous devez savoir
En tant que développeur PHP, vous pouvez avoir besoin d'obtenir les enregistrements MX d'un nom de domaine. La fonction getmxrr() répond à ce besoin.
En tant que développeur PHP, vous pouvez avoir besoin d'obtenir les enregistrements d'échange de courrier (MX) pour un nom de domaine donné. Dans de tels scénarios, la fonction getmxrr() était historiquement utilisée. Important : getmxrr() a été dépréciée dans PHP 8.2 et supprimée dans PHP 8.4. Pour les applications PHP modernes, utilisez dns_get_record() à la place. Cet article explique la fonction historique pour la maintenance des bases de code plus anciennes.
Qu'est-ce que la fonction getmxrr() ?
La fonction getmxrr() effectue une recherche DNS sur un nom de domaine spécifié et retourne un array de tous les enregistrements MX associés. Elle nécessite que l'extension dns soit activée dans votre environnement PHP. La fonction retourne true en cas de succès et false en cas d'échec.
Comment utiliser la fonction getmxrr() ?
L'utilisation de la fonction getmxrr() est simple. Voici la syntaxe de la fonction :
La syntaxe PHP de la fonction getmxrr()
getmxrr($hostname, &$mxhosts, &$weight);La fonction prend trois paramètres :
$hostname: Le nom de domaine pour lequel vous souhaitez récupérer les enregistrements MX.$mxhosts: Une référence vers un array qui stockera les hôtes MX du nom de domaine. (Remarque : en PHP 5.3+, le symbole&n'est requis que dans la signature de la fonction, pas lors de l'appel.)$weight: Une référence vers un array qui stockera les poids de priorité des hôtes MX.
Voici un exemple d'utilisation de la fonction getmxrr() pour récupérer les enregistrements MX d'un nom de domaine :
Comment utiliser la fonction getmxrr() ?
Dans cet exemple, nous récupérons les enregistrements MX pour le nom de domaine « example.com ». La fonction effectue une recherche DNS et remplit les arrays $mxhosts et $weight. Nous parcourons ensuite les arrays pour afficher les hôtes MX et leurs poids. Si la recherche échoue, le bloc else gère l'erreur de manière appropriée.
Comprendre les poids MX (priorité)
Chaque enregistrement MX possède un poids (aussi appelé priorité ou préférence). Lorsqu'un serveur de messagerie délivre un e-mail, il essaie en premier l'hôte avec le poids le plus faible ; les poids plus élevés servent de solutions de repli. Ainsi, un enregistrement avec un poids de 10 est préféré à un enregistrement avec un poids de 20.
getmxrr() ne trie pas les résultats pour vous — les enregistrements sont retournés dans l'ordre renvoyé par le résolveur DNS. Si vous avez besoin de les obtenir dans l'ordre de livraison, triez-les vous-même par poids. Étant donné que $mxhosts et $weight sont des arrays parallèles (l'index 0 de l'un correspond à l'index 0 de l'autre), la meilleure façon de les conserver alignés lors du tri est de les combiner d'abord :
<?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";
}La boucle affiche maintenant le serveur de messagerie le plus prioritaire en premier.
Valeur de retour et pièges courants
- Le type de retour est boolean.
getmxrr()retournetruesi au moins un enregistrement MX a été trouvé, etfalsesinon. Les données réelles sont écrites dans les arrays$mxhostset$weightpassés par référence — elles ne sont pas retournées. - Absence d'enregistrement MX ne signifie pas absence de domaine. Un domaine peut résoudre (avoir un enregistrement
A) sans avoir d'enregistrements MX, auquel casgetmxrr()retournefalse. Selon la norme SMTP, le courrier peut toujours être livré à l'enregistrementAde l'hôte en solution de repli, maisgetmxrr()ne vous l'indiquera pas. - Points finaux. Les noms d'hôtes retournés peuvent inclure un point final (ex.
mail.example.com.). Supprimez-le si vous comparez des chaînes :rtrim($host, '.'). - Nécessite l'extension
dns. Sur la plupart des installations, elle est compilée par défaut, mais les environnements minimaux ou renforcés peuvent la désactiver.
Le remplacement moderne : dns_get_record()
Étant donné que getmxrr() est supprimée dans PHP 8.4, le nouveau code devrait utiliser dns_get_record() avec le drapeau DNS_MX. Elle retourne un unique array plus riche au lieu de deux arrays parallèles :
<?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";
}Chaque élément est ici un array associatif avec des clés telles que host, type, pri et target, de sorte que vous n'avez pas à jongler avec deux arrays en parallèle. Il s'agit de l'approche recommandée pour tout projet PHP 8.x.
Fonctions associées
dns_get_record()— la méthode moderne et entièrement prise en charge pour lire n'importe quel type d'enregistrement DNS, y compris MX.dns_get_mx()— l'alias procédural degetmxrr(); même comportement, même dépréciation.checkdnsrr()— vérifie si des enregistrements DNS d'un type donné existent pour un hôte.gethostbyname()— résout un nom d'hôte en son enregistrementAIPv4.
Conclusion
La fonction getmxrr() est un outil hérité pour récupérer les enregistrements MX dans les anciennes versions de PHP. En comprenant sa syntaxe et son comportement, vous pouvez maintenir la compatibilité avec les bases de code héritées. Pour les nouveaux projets, nous recommandons d'utiliser dns_get_record() avec le drapeau de type DNS_MX à la place. Nous espérons que cet article vous a été utile pour travailler avec les fonctions DNS PHP historiques.