W3docs

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

php— editable, runs on the server

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() retorna true se ao menos um registro MX for encontrado e false caso contrário. Os dados reais são escritos nos arrays por referência $mxhosts e $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() retorna false. De acordo com o padrão SMTP, e-mails ainda podem ser entregues ao registro A do host como alternativa, mas getmxrr() 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 de getmxrr(); 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 IPv4 A.

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.

Prática

Prática
Qual é o papel da função getmxrr() no PHP?
Qual é o papel da função getmxrr() no PHP?
Was this page helpful?