Función PHP getmxrr(): Todo lo que necesitas saber
Como desarrollador PHP, puede que necesites obtener los registros MX de intercambio de correo para un dominio. La función getmxrr() resulta útil en esos casos.
Como desarrollador PHP, puede que necesites obtener los registros de intercambio de correo (MX) para un dominio determinado. En esos casos, la función getmxrr() se usaba históricamente. Importante: getmxrr() fue deprecada en PHP 8.2 y eliminada en PHP 8.4. Para aplicaciones PHP modernas, usa dns_get_record() en su lugar. Este artículo explica la función heredada para mantener bases de código antiguas.
¿Qué es la función getmxrr()?
La función getmxrr() realiza una búsqueda DNS sobre un nombre de dominio especificado y devuelve un array con todos los registros MX asociados. Requiere que la extensión dns esté habilitada en tu entorno PHP. La función devuelve true en caso de éxito y false en caso de fallo.
Cómo usar la función getmxrr()
Usar la función getmxrr() es sencillo. Esta es la sintaxis de la función:
Sintaxis PHP de la función getmxrr()
getmxrr($hostname, &$mxhosts, &$weight);La función acepta tres parámetros:
$hostname: El nombre de dominio del que deseas recuperar los registros MX.$mxhosts: Una referencia a un array que almacenará los hosts MX del dominio. (Nota: En PHP 5.3+, el símbolo&solo es necesario en la firma de la función, no al llamarla.)$weight: Una referencia a un array que almacenará los pesos de prioridad de los hosts MX.
A continuación se muestra un ejemplo de cómo usar la función getmxrr() para recuperar los registros MX de un dominio:
¿Cómo usar la función getmxrr()?
En este ejemplo, recuperamos los registros MX para el dominio "example.com". La función realiza una búsqueda DNS y rellena los arrays $mxhosts y $weight. Luego recorremos los arrays y mostramos los hosts MX y sus pesos. Si la búsqueda falla, el bloque else gestiona el error de forma adecuada.
Entendiendo los pesos MX (prioridad)
Cada registro MX tiene un peso (también llamado prioridad o preferencia). Cuando un servidor de correo entrega un email, intenta primero el host con el menor peso; los pesos más altos actúan como alternativas. Por tanto, un registro con peso 10 tiene preferencia sobre uno con peso 20.
getmxrr() no ordena los resultados por ti — los registros se devuelven en el orden que retorna el resolvedor DNS. Si los necesitas en orden de entrega, ordénalos por peso tú mismo. Como $mxhosts y $weight son arrays paralelos (el índice 0 de uno corresponde al índice 0 del otro), la forma limpia de mantenerlos alineados al ordenar es combinarlos primero:
<?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";
}Ahora el bucle imprime primero el servidor de correo preferido.
Valor de retorno y errores comunes
- El tipo de retorno es boolean.
getmxrr()devuelvetruesi se encontró al menos un registro MX yfalseen caso contrario. Los datos reales se escriben en los arrays$mxhostsy$weightpasados por referencia, no se retornan. - No tener registro MX no es lo mismo que no tener dominio. Un dominio puede resolver (tener un registro
A) pero no tener registros MX, en cuyo casogetmxrr()devuelvefalse. Según el estándar SMTP, el correo aún puede entregarse al registroAdel host como alternativa, perogetmxrr()no te informará de eso. - Puntos finales. Los nombres de host devueltos pueden incluir un punto final (por ejemplo,
mail.example.com.). Recórtalo si comparas cadenas:rtrim($host, '.'). - Requiere la extensión
dns. En la mayoría de las instalaciones viene compilada por defecto, pero entornos mínimos o reforzados pueden deshabilitarla.
El reemplazo moderno: dns_get_record()
Como getmxrr() fue eliminada en PHP 8.4, el código nuevo debería usar dns_get_record() con el indicador DNS_MX. Devuelve un único array más rico en lugar de dos arrays paralelos:
<?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";
}Cada elemento aquí es un array asociativo con claves como host, type, pri y target, por lo que no tienes que gestionar dos arrays en paralelo. Este es el enfoque recomendado para cualquier proyecto PHP 8.x.
Funciones relacionadas
dns_get_record()— la forma moderna y completamente soportada de leer cualquier tipo de registro DNS, incluido MX.dns_get_mx()— el alias procedimental degetmxrr(); mismo comportamiento, misma deprecación.checkdnsrr()— comprueba si existen registros DNS de un tipo dado para un host.gethostbyname()— resuelve un nombre de host a su registroAIPv4.
Conclusión
La función getmxrr() es una herramienta heredada para recuperar registros MX en versiones antiguas de PHP. Al comprender su sintaxis y comportamiento, puedes mantener la compatibilidad con bases de código legadas. Para nuevos proyectos, recomendamos usar dns_get_record() con el indicador de tipo DNS_MX en su lugar. Esperamos que este artículo haya sido informativo para trabajar con las funciones DNS históricas de PHP.