Funzione PHP getmxrr(): Tutto Quello che Devi Sapere
Come sviluppatore PHP, potresti dover ottenere i record MX per un dominio. La funzione getmxrr() era usata per questo scopo nelle versioni legacy.
Come sviluppatore PHP, potresti dover ottenere i record di posta elettronica (MX) per un determinato nome di dominio. In questi scenari, la funzione getmxrr() era storicamente utilizzata. Importante: getmxrr() è stata deprecata in PHP 8.2 e rimossa in PHP 8.4. Per le applicazioni PHP moderne, usa dns_get_record(). Questo articolo illustra la funzione legacy per la manutenzione di codebase più vecchie.
Cos'è la Funzione getmxrr()?
La funzione getmxrr() esegue una ricerca DNS su un nome di dominio specificato e restituisce un array di tutti i record MX associati. Richiede che l'estensione dns sia abilitata nell'ambiente PHP. La funzione restituisce true in caso di successo e false in caso di errore.
Come Usare la Funzione getmxrr()
Usare la funzione getmxrr() è semplice. Ecco la sintassi della funzione:
La sintassi PHP della Funzione getmxrr()
getmxrr($hostname, &$mxhosts, &$weight);La funzione accetta tre parametri:
$hostname: Il nome di dominio per cui si vogliono recuperare i record MX.$mxhosts: Un riferimento a un array che conterrà gli host MX per il nome di dominio. (Nota: in PHP 5.3+, il simbolo&è richiesto solo nella firma della funzione, non quando si chiama la funzione.)$weight: Un riferimento a un array che conterrà i pesi di priorità degli host MX.
Ecco un esempio di come usare la funzione getmxrr() per recuperare i record MX di un nome di dominio:
Come Usare la Funzione getmxrr()?
In questo esempio, recuperiamo i record MX per il nome di dominio "example.com". La funzione esegue una ricerca DNS e popola gli array $mxhosts e $weight. Quindi scorriamo gli array e visualizziamo gli host MX e i loro pesi. Se la ricerca fallisce, il blocco else gestisce l'errore in modo elegante.
Comprendere i Pesi MX (Priorità)
Ogni record MX ha un peso (detto anche priorità o preferenza). Quando un server di posta recapita un'email, tenta prima l'host con il peso più basso; i pesi più alti fungono da fallback. Quindi un record con peso 10 è preferito rispetto a uno con peso 20.
getmxrr() non ordina i risultati per te — i record vengono restituiti nell'ordine in cui il resolver DNS li fornisce. Se hai bisogno di ordinarli per ordine di recapito, ordinali tu stesso per peso. Poiché $mxhosts e $weight sono array paralleli (l'indice 0 dell'uno corrisponde all'indice 0 dell'altro), il modo più pulito per mantenerli allineati durante l'ordinamento è combinarli prima:
<?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";
}Ora il ciclo stampa per primo il server di posta più preferito.
Valore Restituito e Problemi Comuni
- Il tipo restituito è boolean.
getmxrr()restituiscetruese viene trovato almeno un record MX efalsealtrimenti. I dati effettivi vengono scritti negli array$mxhostse$weightpassati per riferimento — non vengono restituiti. - Nessun record MX non equivale a nessun dominio. Un dominio può essere risolto (avere un record
A) pur non avendo record MX; in tal casogetmxrr()restituiscefalse. Secondo lo standard SMTP, la posta può comunque essere recapitata al recordAdell'host come fallback, magetmxrr()non te lo dirà. - Punti finali. I nomi host restituiti possono includere un punto finale (es.
mail.example.com.). Eliminalo se confronti stringhe:rtrim($host, '.'). - Richiede l'estensione
dns. Nella maggior parte delle build è compilata di default, ma ambienti minimali o con elevata sicurezza potrebbero disabilitarla.
Il Sostituto Moderno: dns_get_record()
Poiché getmxrr() è stata rimossa in PHP 8.4, il nuovo codice dovrebbe usare dns_get_record() con il flag DNS_MX. Restituisce un singolo array più ricco anziché due array paralleli:
<?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";
}Ogni elemento è un array associativo con chiavi come host, type, pri e target, quindi non è necessario gestire due array in parallelo. Questo è l'approccio consigliato per qualsiasi progetto PHP 8.x.
Funzioni Correlate
dns_get_record()— il modo moderno e pienamente supportato per leggere qualsiasi tipo di record DNS, incluso MX.dns_get_mx()— l'alias procedurale digetmxrr(); stesso comportamento, stessa deprecazione.checkdnsrr()— verifica se esistono record DNS di un determinato tipo per un host.gethostbyname()— risolve un nome host nel suo record IPv4A.
Conclusione
La funzione getmxrr() è uno strumento legacy per recuperare record MX nelle versioni PHP più vecchie. Comprendendo la sua sintassi e il suo comportamento, puoi mantenere la compatibilità con codebase legacy. Per i nuovi progetti, consigliamo di usare dns_get_record() con il flag di tipo DNS_MX. Speriamo che questo articolo sia stato utile per lavorare con le funzioni DNS PHP storiche.