Ces temps-ci, je travaille sur un projet web qui m'amène à apprendre sur les notions de réseautique. À vrai dire, c'est loin d'être ma force mais je suis quand même stimulé d'avoir quelque chose de nouveau à me mettre sous la dent. Quand on apprend, les journées passent tellement vite!
Dans le cadre de mon boulot, j'ai eu à automatiser des processus qui étaient originalement exécutés manuellement à l'aide de la commande nslookup (Linux et Windows). Cette commande, comme dig, permet de faire des requêtes sur les DNS (Domain Name System) afin d'obtenir de l'information reliée aux types d'enregistrements, par exemple le MX, le A record ou le NS, pour ne nommer que ceux-là.
Dans un invite de commandes, on peut vérifier l'information d'un mail exchanger (MX) comme ceci :
nslookup -type=MX hotmail.com
Wow, 24 mx au total ?!
À titre de référence sur les requêtes que vous pouvez faire, voyez ici la liste des records types pour DNS.
Maintenant, à moi de traduire cela en PHP. Heureusement, le langage compte une librairie intéressante de fonctions réseau.
Ainsi, la fonction getmxrr() permet d'obtenir la liste des MX records associés à un domaine ainsi que leur ordre de priorité. Curieusement, on doit passer deux arrays en référence pour les obtenir séparément. On finit par les fusionner pour faciliter la manipulation. C'est pourquoi c'est plus aisé d'utiliser dns_get_record() qui fait la même chose mais qui en retourne qu'un seul.
// tableau associatifFaites gaffe au moment de l'utiliser, la première fois que je l'ai essayé, je n'avais pas remarqué qu'il fonctionnait à l'aide de constantes. En effet, le deuxième argument est bel et bien une constante et non une chaîne de caractères (DNS_SOA et non 'DNS_SOA'). Ça facilitera nettement les choses si vous utiliser un IDE qui possède une fonction d'auto-complétion : entrez "DNS_" et vous verrez apparaître les valeurs possibles dont DNS_SOA, DNS_MX, DNS_A, etc (une douzaine de possibilités).
$list = dns_get_record('gmail.com', DNS_MX);
print_r($list);
Une petite recommandation : si vous souhaitez seulement vérifier l'existence d'un record, vous pourrez vous contenter des fonctions "check" comme checkdnsrr() ou son alias checkdnsrr().
Lorsqu'un utilisateur entrera un courriel dans son profil, vous pourrez vous assurer que le domaine existe (sans toutefois savoir si le compte, la partie avant le @, est réel) puisque la fonction retourne un booléen pour indiquer vrai ou faux.
$result = checkdnsrr('gmail.com');Pour finir, une dernière remarque : si vous comptez l'utiliser sur un environnement Windows, sachez que les fonctions réseau de PHP ne sont disponible qu'à partir de la version 5.3.