W3docs

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()?

php— editable, runs on the server

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() restituisce true se viene trovato almeno un record MX e false altrimenti. I dati effettivi vengono scritti negli array $mxhosts e $weight passati 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 caso getmxrr() restituisce false. Secondo lo standard SMTP, la posta può comunque essere recapitata al record A dell'host come fallback, ma getmxrr() 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 di getmxrr(); 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 IPv4 A.

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.

Esercizio

Pratica
Qual è il ruolo della funzione getmxrr() in PHP?
Qual è il ruolo della funzione getmxrr() in PHP?
Was this page helpful?