Função PHP getmxrr(): Tudo o Que Você Precisa Saber
Como desenvolvedor PHP, pode ser necessário obter registros MX de um domínio. Saiba tudo sobre a função getmxrr() e sua substituta moderna dns_get_record().
Como desenvolvedor PHP, pode ser necessário obter os registros de troca de mensagens (MX) de um determinado nome de domínio. Nesses cenários, a função getmxrr() era historicamente utilizada. Importante: getmxrr() foi descontinuada no PHP 8.2 e removida no PHP 8.4. Para aplicações PHP modernas, use dns_get_record() em seu lugar. Este artigo explica a função legada para manutenção de bases de código mais antigas.
O que é a Função getmxrr()?
A função getmxrr() realiza uma consulta DNS em um nome de domínio especificado e retorna um array com todos os registros MX associados. Ela requer que a extensão dns esteja habilitada no seu ambiente PHP. A função retorna true em caso de sucesso e false em caso de falha.
Como Usar a Função getmxrr()
Usar a função getmxrr() é simples. Veja a sintaxe da função:
Sintaxe PHP da Função getmxrr()
getmxrr($hostname, &$mxhosts, &$weight);A função aceita três parâmetros:
$hostname: O nome de domínio para o qual você deseja recuperar os registros MX.$mxhosts: Uma referência a um array que armazenará os hosts MX do nome de domínio. (Nota: No PHP 5.3+, o símbolo&é necessário apenas na assinatura da função, não ao chamá-la.)$weight: Uma referência a um array que armazenará os pesos de prioridade dos hosts MX.
Veja um exemplo de como usar a função getmxrr() para recuperar os registros MX de um nome de domínio:
Como Usar a Função getmxrr()?
Neste exemplo, recuperamos os registros MX para o nome de domínio "example.com". A função realiza uma consulta DNS e preenche os arrays $mxhosts e $weight. Em seguida, percorremos os arrays e exibimos os hosts MX e seus pesos. Se a consulta falhar, o bloco else trata o erro de forma adequada.
Entendendo os Pesos MX (Prioridade)
Cada registro MX possui um peso (também chamado de prioridade ou preferência). Quando um servidor de e-mail entrega uma mensagem, ele tenta primeiro o host com o menor peso; pesos maiores funcionam como alternativas. Portanto, um registro com peso 10 é preferido em relação a um com peso 20.
getmxrr() não ordena os resultados para você — os registros são retornados na ordem em que o resolvedor DNS os devolve. Se precisar deles na ordem de entrega, ordene por peso você mesmo. Como $mxhosts e $weight são arrays paralelos (o índice 0 de um corresponde ao índice 0 do outro), a forma mais adequada de mantê-los alinhados durante a ordenação é combiná-los primeiro:
<?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";
}Agora o loop imprime o servidor de e-mail mais preferido primeiro.
Valor de Retorno e Problemas Comuns
- O tipo de retorno é boolean.
getmxrr()retornatruese ao menos um registro MX for encontrado efalsecaso contrário. Os dados reais são escritos nos arrays por referência$mxhostse$weight— não são retornados pela função. - Ausência de registro MX não é o mesmo que ausência de domínio. Um domínio pode ser resolvido (ter um registro
A) mas não ter registros MX; nesse caso,getmxrr()retornafalse. De acordo com o padrão SMTP, e-mails ainda podem ser entregues ao registroAdo host como alternativa, masgetmxrr()não informa isso. - Pontos finais. Os nomes de host retornados podem incluir um ponto final (por exemplo,
mail.example.com.). Remova-o se for comparar strings:rtrim($host, '.'). - Requer a extensão
dns. Na maioria das compilações, ela já está incluída por padrão, mas ambientes mínimos ou com restrições de segurança podem desabilitá-la.
O Substituto Moderno: dns_get_record()
Como getmxrr() foi removida no PHP 8.4, novos códigos devem usar dns_get_record() com o sinalizador DNS_MX. Ela retorna um único array mais rico em vez de dois 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 aqui é um array associativo com chaves como host, type, pri e target, de modo que você não precisa manipular dois arrays simultaneamente. Essa é a abordagem recomendada para qualquer projeto PHP 8.x.
Funções Relacionadas
dns_get_record()— a forma moderna e totalmente suportada de ler qualquer tipo de registro DNS, incluindo MX.dns_get_mx()— o alias procedural degetmxrr(); mesmo comportamento, mesma descontinuação.checkdnsrr()— verifica se registros DNS de um determinado tipo existem para um host.gethostbyname()— resolve um nome de host para seu registro IPv4A.
Conclusão
A função getmxrr() é uma ferramenta legada para recuperar registros MX em versões mais antigas do PHP. Ao entender sua sintaxe e comportamento, é possível manter a compatibilidade com bases de código legadas. Para novos projetos, recomendamos o uso de dns_get_record() com o sinalizador de tipo DNS_MX. Esperamos que este artigo tenha sido informativo para trabalhar com funções DNS históricas do PHP.