← Todas as decisões

ADR-018

IMAP com polling, em vez de webhook ou API de provedor

Nenhuma das três plataformas de leads oferecia webhook, e mexer no MX do domínio por causa de captura era risco desproporcional. O preço da saída: latência de minutos por construção e uma credencial de caixa de e-mail sob responsabilidade da aplicação.

Status
Aceita
Decidida em
24/03/2026
Sistema
plataforma B2B de funil comercial e propostas

Contexto

Três plataformas internacionais de geração de leads entregam os contatos por e-mail, para um endereço da empresa. São cerca de 50 leads por dia útil, e esse volume já chegava assim antes de existir sistema: os leads eram transcritos à mão da caixa de entrada para uma planilha, a caixa era a fila, e a planilha era o cadastro. O sistema não tinha nenhuma infraestrutura de recebimento de e-mail: nem biblioteca, nem serviço, nem IMAP, nem parser.

Critérios que pesaram

Em ordem de peso.

  1. Independência de provedor, porque a empresa pode trocar de e-mail sem que isso vire projeto.
  2. Latência aceitável. O lead não é urgente ao ponto de exigir tempo real, mas é enviado para até quatro empresas concorrentes: minutos importam, segundos não.
  3. Custo zero de terceiros.
  4. Caminho de evolução para quando as plataformas oferecerem API.

Opções consideradas

  • API de e-mail de um provedor de nuvem específico (Microsoft ou Google): traria notificação por push, ao custo de amarrar a captura a um provedor, exigir configuração de identidade corporativa e complicar a autenticação servidor a servidor. Descartada por lock-in.
  • Webhook de entrada por serviço de e-mail transacional: daria tempo real e payload estruturado, mas exige redirecionar o registro de MX do domínio para um serviço pago, com risco de perda quando o webhook falha. Descartada por razão de negócio: mexer no MX do domínio corporativo por causa de captura de lead é risco desproporcional ao ganho.
  • Polling IMAP com o MailKit, biblioteca madura de e-mail em .NET, disparado por job.

O que não foi avaliado, e devia ter sido: o IMAP IDLE, que entrega notificação quase em tempo real sem mexer no MX e sem amarrar a um provedor, ou seja, ataca os dois motivos que derrubaram as outras duas opções. Ele não entrou na comparação, e não por um critério: passou despercebido. Fica registrado assim porque inventar uma justificativa depois seria pior do que admitir a falha na avaliação.

Decisão

A captura é por IMAP, com polling a cada dois minutos, usando o MailKit. O .NET não traz cliente IMAP nativo, e o SmtpClient do System.Net.Mail, além de só enviar, é desaconselhado pela própria documentação para código novo, que aponta o MailKit como alternativa. Funciona com qualquer servidor IMAP, então trocar de provedor é alterar host, porta e credencial. A conexão tem política de retentativa com backoff exponencial (três tentativas, com timeout por tentativa e timeout global), e o job avança pelo identificador da última mensagem processada, em vez de reler a caixa. A senha da caixa fica criptografada no banco, com a chave em variável de ambiente, e nunca aparece em log nem em resposta de API; ela tem inclusive um endpoint próprio de alteração, fora do update comum, para que a credencial não circule em toda edição de rótulo. O caminho de evolução ficou registrado: se as plataformas passarem a oferecer webhook, o parser e o registro de e-mail são reaproveitados como caminho alternativo de entrada, sem reescrever o núcleo.

Consequências

As duas metades pesam igual.

Melhorou

A captura entrou sem alterar DNS, sem contrato novo e sem custo recorrente, reaproveitando o worker que já existia. Desde 13/04/2026, quando entrou no ar, são 5.305 leads capturados sem digitação. E a decisão envelheceu bem: nenhuma das plataformas passou a oferecer webhook até hoje.

Piorou

Latência de minutos por construção, e uma credencial de caixa de e-mail sob responsabilidade da aplicação, o que traz criptografia em repouso, rotação e um endpoint de troca para manter. Depender de IMAP também significa depender do que o provedor considera acesso legítimo: configuração de senha de aplicativo e verificação em duas etapas do lado da empresa fazem parte do procedimento de instalação, e não do código.

Revisitando hoje

Ainda de pé em set/2026, e com duas coisas a dizer.

A primeira é a falha de avaliação: o IMAP IDLE devia ter entrado na comparação e não entrou. Hoje eu o mediria antes de assumir o polling, porque ele derrubaria a latência sem custar nenhum dos riscos que descartaram as outras opções. O que segura a revisão é que a latência de minutos nunca doeu de verdade, e trocar um mecanismo que funciona por um que só é melhor no papel é o tipo de reescrita que se justifica sozinha e não se paga.

A segunda é o que virou trabalho operacional recorrente: a saúde da captura depende de uma caixa de e-mail que alguém administra fora do sistema, e nenhum código protege contra o dia em que essa senha for trocada por outro motivo.

Primeiro de quatro registros sobre a captura de leads. Está publicada como foi escrita, incluindo o que piorou.

IMAP MailKit .NET captura de leads

Blog do Felipe Marciano

Decisões de arquitetura, .NET e sistemas distribuídos, escritas por quem vive com as consequências delas.

© 2026 Felipe Marciano. Todos os direitos reservados.