Cada email que você envia viaja através de uma rede cuidadosamente orquestrada de servidores, e os registros Mail Exchange (MX) são as sinalizações que guiam essa jornada. Compreender como validar registros MX é uma habilidade fundamental para qualquer desenvolvedor que esteja construindo sistemas de verificação de email, formulários de contato ou aplicações que coletam endereços de email. Este guia abrangente explora a validação de registros MX, desde conceitos básicos até estratégias avançadas de implementação, fornecendo o conhecimento necessário para criar verificação de email robusta em suas aplicações.
Compreendendo os Registros MX
Os registros Mail Exchange são registros DNS que especificam quais servidores de email são responsáveis por aceitar emails em nome de um domínio. Quando você envia um email para user@example.com, seu servidor de email precisa saber onde entregá-lo. Os registros MX fornecem essa informação apontando para os servidores de email do domínio.
Como os Registros MX Funcionam
Quando um email é enviado, o servidor de email remetente executa uma pesquisa DNS para encontrar os registros MX do domínio do destinatário. Esta pesquisa retorna um ou mais nomes de host de servidores de email, juntamente com valores de prioridade que indicam a ordem de preferência.
Uma pesquisa típica de registro MX para gmail.com pode retornar:
O servidor remetente tenta a entrega primeiro para o servidor de menor prioridade (neste caso, prioridade 5). Se esse servidor estiver indisponível, ele tenta o próximo nível de prioridade, e assim por diante. Essa redundância garante a entrega de email mesmo quando servidores individuais estão offline.
Componentes do Registro MX
Cada registro MX contém duas informações essenciais:
Prioridade (Preferência)
Um valor numérico que indica a ordem em que os servidores de email devem ser testados. Números mais baixos indicam maior prioridade. Servidores com a mesma prioridade são testados em ordem aleatória, proporcionando balanceamento de carga.
Nome do Host do Servidor de Email
O nome de domínio totalmente qualificado (FQDN) do servidor de email que processa emails para o domínio. Este nome de host deve ser resolvido para um endereço IP através de um registro A ou AAAA.
Por Que os Registros MX São Importantes para a Verificação de Email
A validação de registros MX serve como um ponto de verificação crítico no processo de verificação de email:
Comece a verificar e-mails com o BillionVerify hoje. Ganhe 10 créditos grátis ao se cadastrar - sem necessidade de cartão de crédito. Junte-se a milhares de empresas melhorando seu ROI de email marketing com verificação precisa de e-mails.
Sem necessidade de cartão de crédito100+ créditos grátis por diaComece em 30 segundos
Se um domínio não tiver registros MX, normalmente não pode receber email. Alguns domínios podem ter um fallback de registro A, mas a ausência de registros MX é frequentemente um forte indicador de que o domínio não está configurado para email.
Verificação de Infraestrutura
Registros MX válidos que resolvem para servidores de email funcionais indicam que o domínio possui infraestrutura de email implementada. Isso não garante que um endereço específico exista, mas confirma que o domínio pode receber email.
Detecção de Spam e Fraude
Empresas legítimas mantêm registros MX adequados. Domínios suspeitos usados para spam ou fraude frequentemente possuem registros MX mal configurados ou ausentes.
Otimização de Desempenho
Verificar registros MX antes de tentar verificação SMTP evita perda de tempo conectando-se a domínios que não podem receber email.
Implementando Pesquisas de Registros MX
Vamos explorar como implementar a validação de registros MX em diferentes ambientes de programação.
Implementação em Node.js
Node.js fornece resolução DNS integrada através do módulo dns:
const dns = require('dns').promises;
async function getMxRecords(domain) {
try {
const records = await dns.resolveMx(domain);
// Ordenar por prioridade (menor primeiro)
records.sort((a, b) => a.priority - b.priority);
return {
success: true,
domain,
records: records.map(r => ({
exchange: r.exchange,
priority: r.priority
}))
};
} catch (error) {
return {
success: false,
domain,
error: error.code,
message: getMxErrorMessage(error.code)
};
}
}
function getMxErrorMessage(code) {
const messages = {
'ENODATA': 'No MX records found for this domain',
'ENOTFOUND': 'Domain does not exist',
'ETIMEOUT': 'DNS lookup timed out',
'ESERVFAIL': 'DNS server failed to respond'
};
return messages[code] || 'Unknown DNS error';
}
// Uso
const result = await getMxRecords('gmail.com');
console.log(result);
Implementação em Python
O módulo dns.resolver do Python da biblioteca dnspython fornece capacidades abrangentes de pesquisa DNS:
import dns.resolver
import dns.exception
def get_mx_records(domain):
try:
answers = dns.resolver.resolve(domain, 'MX')
records = []
for rdata in answers:
records.append({
'exchange': str(rdata.exchange).rstrip('.'),
'priority': rdata.preference
})
# Ordenar por prioridade
records.sort(key=lambda x: x['priority'])
return {
'success': True,
'domain': domain,
'records': records
}
except dns.resolver.NXDOMAIN:
return {
'success': False,
'domain': domain,
'error': 'NXDOMAIN',
'message': 'Domain does not exist'
}
except dns.resolver.NoAnswer:
return {
'success': False,
'domain': domain,
'error': 'NoAnswer',
'message': 'No MX records found for this domain'
}
except dns.exception.Timeout:
return {
'success': False,
'domain': domain,
'error': 'Timeout',
'message': 'DNS lookup timed out'
}
# Uso
result = get_mx_records('gmail.com')
print(result)
Implementação em Go
O pacote net do Go fornece funções diretas de pesquisa DNS:
package main
import (
"fmt"
"net"
"sort"
)
type MxResult struct {
Success bool
Domain string
Records []MxRecord
Error string
}
type MxRecord struct {
Exchange string
Priority uint16
}
func getMxRecords(domain string) MxResult {
records, err := net.LookupMX(domain)
if err != nil {
return MxResult{
Success: false,
Domain: domain,
Error: err.Error(),
}
}
if len(records) == 0 {
return MxResult{
Success: false,
Domain: domain,
Error: "No MX records found",
}
}
// Ordenar por prioridade
sort.Slice(records, func(i, j int) bool {
return records[i].Pref < records[j].Pref
})
result := MxResult{
Success: true,
Domain: domain,
Records: make([]MxRecord, len(records)),
}
for i, r := range records {
result.Records[i] = MxRecord{
Exchange: r.Host,
Priority: r.Pref,
}
}
return result
}
func main() {
result := getMxRecords("gmail.com")
fmt.Printf("%+v\n", result)
}
Técnicas Avançadas de Validação MX
Pesquisas MX básicas confirmam que os registros existem, mas a validação abrangente de email requer análise mais profunda.
Validando Conectividade do Servidor de Email
Registros MX apontam para nomes de host que devem ser resolvidos para endereços IP. Verifique se os servidores de email estão realmente acessíveis:
const dns = require('dns').promises;
const net = require('net');
async function validateMxConnectivity(domain) {
// Obter registros MX
const mxResult = await getMxRecords(domain);
if (!mxResult.success) {
return mxResult;
}
// Validar cada servidor de email
const validatedRecords = [];
for (const record of mxResult.records) {
const validation = await validateMailServer(record.exchange);
validatedRecords.push({
...record,
...validation
});
}
return {
success: true,
domain,
records: validatedRecords,
hasReachableServer: validatedRecords.some(r => r.reachable)
};
}
async function validateMailServer(hostname) {
try {
// Resolver nome do host para IP
const addresses = await dns.resolve4(hostname);
if (addresses.length === 0) {
return { reachable: false, error: 'No A record' };
}
// Testar conexão na porta 25
const connected = await testConnection(addresses[0], 25);
return {
reachable: connected,
ip: addresses[0],
error: connected ? null : 'Connection refused'
};
} catch (error) {
return {
reachable: false,
error: error.message
};
}
}
function testConnection(host, port, timeout = 5000) {
return new Promise((resolve) => {
const socket = new net.Socket();
socket.setTimeout(timeout);
socket.on('connect', () => {
socket.destroy();
resolve(true);
});
socket.on('timeout', () => {
socket.destroy();
resolve(false);
});
socket.on('error', () => {
resolve(false);
});
socket.connect(port, host);
});
}
Gerenciando Fallback de Registro A
Quando não existem registros MX, os padrões de email (RFC 5321) especificam que o registro A do domínio deve ser usado como fallback. Implemente esse fallback em sua validação:
async function getMailServers(domain) {
// Tentar registros MX primeiro
try {
const mxRecords = await dns.resolveMx(domain);
if (mxRecords.length > 0) {
return {
type: 'MX',
servers: mxRecords.sort((a, b) => a.priority - b.priority)
};
}
} catch (error) {
if (error.code !== 'ENODATA') {
throw error;
}
}
// Fallback para registro A
try {
const aRecords = await dns.resolve4(domain);
if (aRecords.length > 0) {
return {
type: 'A_FALLBACK',
servers: [{ exchange: domain, priority: 0 }],
warning: 'Using A record fallback - no MX records found'
};
}
} catch (error) {
if (error.code !== 'ENODATA') {
throw error;
}
}
return {
type: 'NONE',
servers: [],
error: 'No mail servers found for domain'
};
}
Detectando Registros MX Nulos
A RFC 7505 define registros "null MX" que indicam explicitamente que um domínio não aceita email. Esses registros possuem uma única entrada MX com prioridade 0 e um nome de host vazio ("."):
function hasNullMx(mxRecords) {
if (mxRecords.length === 1) {
const record = mxRecords[0];
if (record.priority === 0 &&
(record.exchange === '.' || record.exchange === '')) {
return true;
}
}
return false;
}
async function validateDomainMx(domain) {
const mxResult = await getMxRecords(domain);
if (!mxResult.success) {
return mxResult;
}
if (hasNullMx(mxResult.records)) {
return {
success: false,
domain,
error: 'NULL_MX',
message: 'Domain explicitly does not accept email'
};
}
return mxResult;
}
Cacheando Pesquisas MX
Pesquisas DNS adicionam latência a cada verificação. Implemente cache para melhorar o desempenho:
class MxCache {
constructor(ttlMs = 3600000) { // TTL padrão de 1 hora
this.cache = new Map();
this.ttl = ttlMs;
}
get(domain) {
const entry = this.cache.get(domain.toLowerCase());
if (!entry) return null;
if (Date.now() > entry.expiry) {
this.cache.delete(domain.toLowerCase());
return null;
}
return entry.data;
}
set(domain, data) {
this.cache.set(domain.toLowerCase(), {
data,
expiry: Date.now() + this.ttl
});
}
// Respeitar valores TTL do DNS quando disponíveis
setWithTtl(domain, data, ttlSeconds) {
const ttlMs = Math.min(ttlSeconds * 1000, this.ttl);
this.cache.set(domain.toLowerCase(), {
data,
expiry: Date.now() + ttlMs
});
}
}
const mxCache = new MxCache();
async function getMxRecordsCached(domain) {
const cached = mxCache.get(domain);
if (cached) {
return { ...cached, fromCache: true };
}
const result = await getMxRecords(domain);
if (result.success) {
mxCache.set(domain, result);
}
return { ...result, fromCache: false };
}
Padrões Comuns de Registros MX
Compreender configurações MX comuns ajuda a interpretar resultados de validação e identificar possíveis problemas.
Principais Provedores de Email
Reconhecer padrões MX de provedores principais pode ajudar a identificar endereços de email gratuitos:
Domínios do Google Workspace (antigo G Suite) usam servidores de email do Google, mas não são contas de email gratuitas:
function isGoogleWorkspace(domain, mxRecords) {
const isGoogleMx = mxRecords.some(r =>
r.exchange.toLowerCase().includes('google') ||
r.exchange.toLowerCase().includes('googlemail')
);
// Verificar se o domínio não é um domínio consumidor conhecido do Google
const googleConsumerDomains = ['gmail.com', 'googlemail.com'];
const isConsumerDomain = googleConsumerDomains.includes(domain.toLowerCase());
return isGoogleMx && !isConsumerDomain;
}
Detecção de Email Auto-Hospedado
Domínios que hospedam seu próprio email frequentemente possuem registros MX apontando para subdomínios:
A validação MX é uma etapa em um processo abrangente de verificação de email. Compreender seu papel ajuda a construir pipelines de verificação eficazes.
Ordem de Verificação
A validação MX normalmente ocorre no início do pipeline de verificação:
Embora implementar a validação MX você mesmo forneça valor educacional, serviços profissionais de verificação de email como o BillionVerify lidam com a validação MX como parte da verificação abrangente de email.
Vantagens de Usar uma API de Verificação de Email
Verificações Abrangentes
A API de verificação de email do BillionVerify combina validação MX com verificação de sintaxe, verificação SMTP, detecção de email descartável e muito mais em uma única chamada de API. Isso elimina a necessidade de manter múltiplos sistemas de validação.
Infraestrutura Otimizada
Serviços profissionais mantêm resolvedores DNS distribuídos globalmente, gerenciam cache em escala e otimizam o desempenho em milhões de verificações.
Atualizações Contínuas
Configurações de servidores de email mudam constantemente. Serviços de verificação de email atualizam continuamente seus bancos de dados de provedores conhecidos, domínios descartáveis e padrões de servidores de email.
A validação de registros MX é um componente fundamental da verificação de email que confirma se um domínio pode receber email antes de tentar verificações mais intensivas em recursos. Ao implementar a validação MX adequada, você pode filtrar rapidamente domínios inválidos, otimizar o desempenho da verificação e construir aplicações de tratamento de email mais confiáveis.
Principais conclusões para validação de registros MX:
Sempre verifique os registros MX antes de tentar verificação SMTP para economizar tempo e recursos
Gerencie o fallback de registro A de acordo com os padrões RFC para domínios sem registros MX
Implemente cache para reduzir a sobrecarga de pesquisa DNS para validações repetidas
Reconheça padrões comuns para identificar provedores de email e riscos potenciais
Trate erros graciosamente com timeouts, retries e mensagens de erro adequadas
Seja construindo um sistema personalizado de verificação de email ou integrando com um serviço como o BillionVerify, compreender registros MX ajuda você a construir melhor tratamento de email em suas aplicações. Comece a implementar a validação MX hoje e dê o primeiro passo em direção à verificação abrangente de email.