API de Verificação de E-mail: Integre em 10 Minutos (Exemplos de Código)

API de Verificação de E-mail: Integre em 10 Minutos (Exemplos de Código)

Você decidiu adicionar verificação de e-mail à sua aplicação. Boa escolha — é a mudança de maior impacto que você pode fazer para melhorar a qualidade dos cadastros, reduzir devoluções e prevenir fraudes.

Este guia oferece código pronto para produção para integrar a verificação de e-mail em qualquer stack. Python, JavaScript, PHP, cURL — escolha sua linguagem e copie o código.


Por que a verificação no servidor é importante

Antes de escrevermos qualquer código, vamos deixar uma coisa clara: a validação de e-mail no lado do cliente não é suficiente.

// Isto NÃO é verificação — é apenas uma checagem de sintaxe
const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
// "thisdoesnotexist8472@gmail.com" → true (a sintaxe está correta, mas a caixa de e-mail não existe)

A expressão regular do lado do cliente detecta erros de formatação. Ela não informa se a caixa de e-mail realmente existe. Para isso, você precisa de verificação em nível SMTP — e isso exige uma chamada de API no servidor.


Obtendo sua chave de API

Primeiro, cadastre-se em email-validaton.com e copie sua chave de API no painel. Contas gratuitas recebem 100 verificações por mês.

Mantenha sua chave de API em sigilo — ela nunca deve aparecer em JavaScript do lado do cliente. Sempre chame a API de verificação a partir do seu backend.


Verificação de e-mail individual

Python

import requests
from typing import Optional

def verify_email(email: str, api_key: str) -> dict:
    """Verifica um único endereço de e-mail."""
    resp = requests.get(
        "https://email-validaton.com/api/v1/verify",
        params={"email": email},
        headers={"Authorization": f"Bearer {api_key}"},
        timeout=15,
    )
    resp.raise_for_status()
    return resp.json()

# Uso
result = verify_email("user@example.com", "YOUR_API_KEY")
print(f"Estado: {result['status']}")
print(f"Pontuação: {result['score']}/10")
print(f"Confiança: {result.get('confidence', 'N/A')}")

if result["status"] == "valid":
    # Prosseguir com a criação da conta
    create_user(email)
elif result["status"] in ("invalid", "disposable"):
    # Rejeitar ou sinalizar
    raise ValueError(f"Email inválido: {result['reason']}")

JavaScript (Node.js)

async function verifyEmail(email, apiKey) {
  const url = new URL("https://email-validaton.com/api/v1/verify");
  url.searchParams.set("email", email);

  const resp = await fetch(url, {
    headers: { Authorization: `Bearer ${apiKey}` },
  });

  if (!resp.ok) throw new Error(`Erro de API: ${resp.status}`);
  return resp.json();
}

// Utilização
const result = await verifyEmail("user@example.com", process.env.EV_API_KEY);
console.log(`Estado: ${result.status}, Pontuação: ${result.score}/10`);

if (result.status === "valid") {
  await db.users.insert({ email, verified: true });
} else {
  throw new Error(result.reason || "Falha na verificação do e-mail");
}

PHP

function verify_email(string $email, string $api_key): array {
    $url = "https://email-validaton.com/api/v1/verify?email=" . urlencode($email);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ["Authorization: Bearer $api_key"],
        CURLOPT_TIMEOUT => 15,
    ]);

    $body = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($http_code !== 200) {
        throw new RuntimeException("API retornou $http_code");
    }

    return json_decode($body, true);
}

// Utilização
$result = verify_email("user@example.com", getenv("EV_API_KEY"));
echo "Estado: {$result['status']}, Pontuação: {$result['score']}/10\n";

cURL (CLI / Scripts de Shell)

#!/bin/bash
API_KEY="your_api_key"
EMAIL="user@example.com"

curl -s -H "Authorization: Bearer $API_KEY" \
  "https://email-validaton.com/api/v1/verify?email=$EMAIL" | python3 -m json.tool

Compreendendo a Resposta

Cada verificação retorna uma estrutura JSON consistente:

{
  "email": "user@gmail.com",
  "status": "valid",
  "score": 9,
  "confidence": "high",
  "reason": "Caixa de correio existe e aceita e-mails",
  "mx_server": "gmail-smtp-in.l.google.com",
  "duration_ms": 287,
  "disposable": false,
  "role_account": false,
  "free_provider": true
}

Principais Campos Explicados

Campo Valores Significado
status valid, invalid, catch_all, unknown, risky, disposable, over_quota, error O resultado da verificação
score 0–10 Pontuação composta de qualidade. 8+ = excelente, 5-7 = moderada, <5 = arriscada
confidence high, medium, low Quão confiável é o resultado
reason String legível por humanos Por que o status foi atribuído
disposable booleano Endereço de e-mail temporário
role_account booleano info@, support@, admin@, etc.
free_provider booleano Gmail, Yahoo, Outlook, etc.

Padrões de Integração

Padrão 1: Validação de Formulário de Registo (o mais comum)

@app.route("/register", methods=["POST"])
def register():
    email = request.form["email"]
    password = request.form["password"]

    # 1. Verificação de sintaxe (rápida, local)
    if "@" not in email ou "." not in email.split("@")[-1]:
        return jsonify({"error": "Formato de e-mail inválido"}), 400

    # 2. Verificação SMTP (chamada à API)
    try:
        result = verify_email(email, current_app.config["EV_API_KEY"])
    except requests.RequestException:
        # A API está indisponível — não bloquear as inscrições, apenas marcar para revisão
        create_user(email, password, flags=["unverified"])
        return redirect(url_for("dashboard"))

    # 3. Lógica de negócio com base no resultado
    if result["status"] == "valid":
        create_user(email, password, verified=True)
        return redirect(url_for("bem-vindo"))

    if result["status"] == "disposable":
        return jsonify({
            "error": "Por favor, use um endereço de e-mail permanente"
        }), 400

    if result["status"] == "invalid":
        return jsonify({
            "error": "Este endereço de e-mail não parece existir"
        }), 400

    # Catch-all, desconhecido, arriscado — permitir, mas sinalizar
    create_user(email, password, flags=[result["status"]])
    return redirect(url_for("bem-vindo"))

Padrão 2: Verificação Assíncrona (Não Bloqueante)

Em produção em escala, você não quer que os usuários esperem pela chamada da API:

import threading

def verify_async(email: str, api_key: str, user_id: int):
    """Verifica o e-mail em segundo plano e atualiza o registro do usuário."""
    try:
        result = verify_email(email, api_key)
        db.users.update(user_id, {
            "email_status": result["status"],
            "email_score": result["score"],
            "verified_at": datetime.utcnow(),
        })
    except Exceção as e:
        logger.error(f"Falha na verificação em segundo plano para {user_id}: {e}")

# No seu handler de registro:
user = create_user(email, password)
threading.Thread(
    alvo=verify_async,
    args=(email, api_key, user.id),
    daemon=True,
).start()

Padrão 3: Processamento de Listas em Massa

Para limpar listas grandes através do endpoint de upload em massa:

import requests
import time

def bulk_verify(file_path: str, api_key: str) -> str:
    """Envia um arquivo para verificação em massa. Retorna o ID da tarefa."""
    with open(file_path, "rb") as f:
        resp = requests.post(
            "https://email-validaton.com/api/v1/bulk",
            files={"file": f},
            headers={"Authorization": f"Bearer {api_key}"},
        )
    return resp.json()["job_id"]

def wait_for_results(job_id: str, api_key: str, poll_sec: int = 5):
    """Consulta até a tarefa em massa ser concluída e, em seguida, baixa os resultados."""
    while True:
        resp = requests.get(
            f"https://email-validaton.com/api/v1/bulk/status/{job_id}",
            headers={"Authorization": f"Bearer {api_key}"},
        )
        data = resp.json()
        if data["status"] in ("completed", "failed", "cancelled"):
            return data
        time.sleep(poll_sec)

# Uso
job_id = bulk_verify("my_list.csv", API_KEY)
result = wait_for_results(job_id, API_KEY)
# Descarregar o ficheiro de resultados
download = requests.get(result["result_url"])

Tratamento de Erros e Boas Práticas

Tratamento de Timeouts

A API de verificação normalmente responde em 200-800 ms. Defina um timeout de 10-15 segundos para lidar com problemas de rede de forma adequada.

Limite de Requisições

As contas gratuitas estão limitadas a 100/dia. Os planos pagos variam entre 5.000 e 500.000/mês. A API devolve 429 Too Many Requests when you exceed your limit.

Lógica de Repetição

Para falhas transitórias (erros de rede, 503), repita até 3 vezes com backoff exponencial:

import time
from requests.exceptions import RequestException

def verify_with_retry(email, api_key, max_retries=3):
    for attempt in range(max_retries):
        try:
            return verify_email(email, api_key)
        except RequestException:
            if attempt == max_retries - 1:
                raise
            time.sleep(2 ** attempt)

Não Bloquear Registos em Caso de Falha da API

Se a API de verificação estiver temporariamente indisponível, não bloqueie o registo do utilizador.Em vez disso:
1. Permita o registo e marque a conta como "pendente de verificação"
2. Execute a verificação de forma assíncrona quando a API voltar a funcionar
3. Notifique o utilizador se o seu e-mail for inválido posteriormente

Bloquear os registos durante uma falha da API faz perder utilizadores reais.


Conclusão

A verificação de e-mail não é opcional para aplicações em produção. Os e-mails inválidos causam devoluções, os e-mails descartáveis permitem abusos e as listas não verificadas prejudicam a sua reputação de remetente.

Os padrões de integração neste guia cobrem os casos de utilização mais comuns. Copie o código, adapte-o à sua stack e comece a verificar todos os e-mails que entram no seu sistema.

Pronto para integrar? Obtenha a sua chave de API gratuita — 100 verificações incluídas.

Pronto para limpar a sua lista de e-mails?

200 verificações gratuitas. Sem cartão de crédito. Validação SMTP completa em menos de 1 segundo.

🚀 Criar Conta Gratuita
MP

Milan Pasić

Milan Pasić é o fundador da N-Software e o programador principal do Email Validator. Passou mais de uma década a construir infraestruturas de email, ferramentas de entregabilidade e sistemas de validação SMTP utilizados por milhares de profissionais de marketing e programadores em todo o mundo.