Ir para o conteúdo

E-mail de teste para desenvolvedores e QA: o que o staging esconde nos e-mails transacionais

Digamos que sua equipe lance um novo e-mail de redefinição de senha. O QA aprova no staging: a mensagem aparece, o link funciona, o modelo está certo. Dois dias depois do lançamento, o suporte tem uma fila de chamados. Quem usa endereços do Gmail diz que o e-mail nunca chegou. Gente de algumas grandes empresas diz que chegou, mas o link já estava "usado" no primeiro clique. Ninguém mexeu no código entre o staging e a produção, e todos os testes continuam passando.

Então qual e-mail de teste para desenvolvedores teria pegado isso? Nenhum sozinho. Um capturador SMTP local serve para o desenvolvimento diário, o sandbox do seu provedor ou um domínio de teste que você controla serve para testes automatizados, e uma caixa externa real serve para a conferência manual de que o e-mail sai do seu ambiente parecido com a produção e chega ao domínio de um desconhecido. Uma caixa temporária como o VookMail cobre esse último caso sem configuração, porque o endereço está pronto quando a página carrega. Contas de teste em grandes provedores de e-mail cobrem então a parte que nenhuma dessas opções enxerga. O resto deste guia trata de escolher entre essas opções, ler as falhas quando acontecem e as verificações que pertencem a um lançamento.

Por que aquela redefinição passou no staging

Staging e produção raramente são tão parecidos quanto o diagrama de implantação sugere, e o e-mail expõe as diferenças mais do que a maioria dos recursos. Uma mensagem passa pela sua aplicação, por uma fila, por um provedor, pelo DNS, pelo servidor do destinatário e pelo cliente do destinatário. O staging pode usar uma versão diferente de quase tudo isso.

Pegue o primeiro chamado, os usuários do Gmail que não receberam nada. Suponha que o staging envie por um subdomínio do provedor autenticado meses atrás, enquanto a produção envia de um novo domínio no From, criado com a mudança de marca. As diretrizes de remetentes do Google exigem que todos os remetentes se autentiquem com SPF ou DKIM, e a tabela de erros do Gmail lista 5.7.26 para e-mail não autenticado. Uma caixa interna de QA no seu próprio domínio pode deixar a mesma mensagem passar, já que o seu próprio servidor pode confiar no seu próprio relay. O teste nunca poderia falhar.

O segundo chamado, o link "já usado", tem outra causa. Os gateways de segurança corporativos costumam abrir os links dos e-mails recebidos para examiná-los antes que a pessoa os veja. Se o seu link resgata o token numa simples requisição GET, o scanner o consome, e o funcionário clica num link morto. Nenhuma caixa de staging sua roda esse scanner, a menos que a sua própria empresa por acaso use um.

Esses dois bugs não podem ser vistos do mesmo lugar. Um exige entrega real a um sistema receptor que você não controla. O outro exige uma mudança em como o link se comporta, o que uma revisão pegaria mais facilmente do que um teste. Esse é o argumento a favor de testar em camadas: cada tipo de endereço responde a uma pergunta e se cala sobre as outras.

O que costuma diferir entre staging e produçãoO que pode esconder
Domínio de envio e endereço do FromSPF e DKIM ausentes ou desalinhados
Conta ou subconta do provedorModo sandbox, limites de envio, uma reputação de IP diferente
DestinatáriosDomínios internos que confiam em você e listas de permissão que escondem endereços ruins
Rastreamento de cliquesLinks reescritos que quebram, ou um domínio de rastreamento sem certificado válido
VolumeFilas e limites de taxa que só pesam sob carga
Listas de supressãoEndereços de produção que devolveram uma vez e agora são silenciosamente ignorados
Configurações de URL baseLinks que apontam para o host errado

Que endereço responde a que pergunta

Aqui estão as opções, cada uma com a pergunta que ela realmente consegue responder.

Um capturador local: "o que meu app produziu?"

Um capturador SMTP aceita tudo o que o seu app envia e mostra em uma página web, sem entregar nada. O Mailpit é uma escolha open source popular. Por padrão, escuta SMTP na porta 1025 e serve a interface web na porta 8025, então você aponta as configurações de desenvolvimento para localhost:1025 e abre http://localhost:8025. O Ethereal, do Nodemailer, é uma ideia parecida, com um serviço SMTP falso hospedado. Um capturador é rápido e privado, e permite enviar para qualquer endereço sem risco de chegar a uma pessoa real. Também não diz nada sobre DNS, autenticação ou filtragem, porque nada atravessa a internet.

O auxiliar de teste de um framework: "meu código pediu o e-mail certo?"

A maioria dos frameworks consegue registrar os e-mails enviados em memória durante uma execução de testes. O Laravel tem Mail::fake(), o Django reúne as mensagens em django.core.mail.outbox e o Rails tem ActionMailer::Base.deliveries. Use-os para verificar que uma tarefa dispara uma vez, com o destinatário e o token certos. É o retorno mais rápido que você consegue, e testam ainda menos do mundo externo do que um capturador.

O modo de teste de um provedor: "minha integração funciona?"

Os provedores oferecem tipos diferentes de ajuda aqui, e as diferenças importam. O Amazon SES tem um simulador de caixa de entrada, com endereços como success@simulator.amazonses.com, bounce@simulator.amazonses.com e complaint@simulator.amazonses.com, que produzem esses resultados sem prejudicar a sua reputação. Uma conta nova do SES também começa em um sandbox, onde só pode enviar a endereços verificados. O modo sandbox do SendGrid, definido por mail_settings.sandbox_mode.enable, valida a sua requisição sem entregar. O Postmark aceita o token POSTMARK_API_TEST para o mesmo fim. São bons para erros de API e para webhooks de devolução e de reclamação, e não provam que o e-mail chegou a alguém. Confira a documentação atual do seu provedor, pois esses recursos mudam.

Um domínio de teste seu: "o fluxo completo funciona, repetidamente?"

Para testes automatizados de ponta a ponta, configure um domínio ou subdomínio que você controle, com uma caixa catch-all ou um webhook de entrada, para que o código de teste leia o e-mail por uma API. Dá algum trabalho configurar, mas é privado e estável, e não depende do site de mais ninguém. Não invente endereços em domínios que você não possui. Alguém pode ser dono de testuser@gmail.com e vai receber o que você enviar. A RFC 2606 reserva example.com e os nomes de topo .test e .example para que a documentação e os dados de teste tenham um lugar seguro para apontar. Esses nomes não recebem e-mail, o que os torna certos para fixtures e inúteis para testes de entrega.

Uma caixa temporária externa real: "o domínio de um desconhecido receberia isto?"

É aqui que uma caixa temporária ganha seu lugar. É uma caixa real em um domínio que você não controla e para o qual não tem lista de permissão. Sua mensagem precisa encontrar o registro MX, fazer uma conexão SMTP e ser aceita. No VookMail, os registros MX dos domínios apontam para um provedor de entrega de e-mail que recebe a mensagem e a encaminha por HTTPS. Um endereço novo também significa nenhum histórico: sem mensagens antigas, sem devolução anterior na sua lista de supressão, sem filtros. Isso o torna um jeito rápido de reproduzir "me cadastrei com um endereço novo e não recebi nada". Também é útil para quem não é desenvolvedor. Um designer ou gerente de produto pode ler o que um novo usuário recebe sem nenhum acesso às suas ferramentas.

Contas de teste em grandes provedores: "onde ele cai?"

Uma mensagem entregue em um domínio não diz nada sobre a pasta de spam de outro. Mantenha um pequeno conjunto de contas reais nos provedores que os seus usuários realmente usam e confira a colocação antes de mudanças significativas de modelo ou de domínio. Depois acompanhe os números de devoluções e reclamações após um lançamento. Se os seus e-mails parecem um problema de spam, essas contas são onde você verá isso primeiro.

AbordagemAtravessa a internetConfiguraçãoAutomaçãoPrivacidade do conteúdoMelhor etapa
Auxiliar de teste do frameworkNãoNenhumaExcelenteFica no processoTestes unitários e de funcionalidade
Capturador SMTP localNãoBaixaBoaFica localDesenvolvimento
Modo de teste do provedorGeralmente nãoBaixaBoaFica com o provedorTestes de integração
Seu próprio domínio de testeSimMédia a altaBoaVocê controlaCI de ponta a ponta, staging
Caixa temporáriaSimNenhumaNão recomendadaTrate como públicaQA manual e verificações pré-lançamento
Contas de testeSimMédiaLimitadaModeradaVerificações de colocação

Uma execução manual com uma caixa temporária

Aqui vai um roteiro repetível por um fluxo de cadastro no staging ou em um ambiente de pré-produção. Deve levar cerca de dez minutos quando você já o conhece.

  1. Confirme que o ambiente usa a mesma configuração de provedor que a produção, exceto pelas credenciais, e que contém apenas dados inventados. Se não for o caso, anote isso, porque limita o que você pode concluir.
  2. Abra o VookMail e toque em Novo. Digite um nome de usuário que codifique o teste, como email-signup-03-x7, escolha um dos mais de 30 domínios e toque na seta. Use o botão amarelo «Aleatório» se algo no e-mail puder ser sensível, porque qualquer pessoa que conheça ou adivinhe um endereço pode abrir aquela caixa de entrada.
  3. Toque em Copiar e cadastre-se como um novo usuário com dados de perfil inventados.
  4. Anote a hora em que você enviou e a hora em que a mensagem aparece. A caixa verifica a cada poucos segundos, então uma diferença de minutos aponta para a sua fila ou para o provedor. Toque em Atualizar se quiser ter certeza.
  5. Leia a mensagem como um novo usuário leria: nome do remetente, assunto, texto de prévia, corpo, botão, link simples, rodapé. O VookMail mostra códigos e links de confirmação detectados acima da mensagem, o que é uma verificação aproximada de que o seu código e o seu link são fáceis de achar.
  6. Veja-a com as imagens desligadas. O VookMail mantém as imagens desligadas até você permitir e remove os pixels de rastreamento ocultos. Se a mensagem não faz sentido nesse estado, parte dos seus usuários está vendo o mesmo. Não use essa caixa para avaliar o seu rastreamento de abertura, porém, já que os pixels não disparam.
  7. Toque no botão QR, leia o endereço com um celular de teste e abra a mesma caixa lá para tocar no link de verdade em um dispositivo de verdade, principalmente se você usa universal links ou app links.
  8. Conclua a verificação e confirme que o estado da conta muda como deveria.
  9. Execute os casos negativos do checklist abaixo: reutilizar o link, esperar a expiração, pedir um reenvio.
  10. Guarde as evidências: capturas de tela, horários e o endereço usado. As mensagens são removidas depois de cerca de um dia, então um relatório de bug escrito na semana que vem não terá nada a que apontar.
  11. Toque em Excluir e remova a conta de teste se o seu processo exigir.

Vários endereços podem ser mantidos em um só navegador, então quem convida e quem é convidado, ou os endereços antigo e novo de uma troca de e-mail, podem estar abertos ao mesmo tempo. Se você anexar arquivos no teste, lembre-se de que o VookMail recusa arquivos de programa comuns como .exe e mostra um aviso sobre arquivos compactados, então um anexo rejeitado ali pode não ser um bug do seu lado.

Lendo uma falha

"O e-mail nunca chegou" descreve um sintoma que pode estar em cerca de seis lugares, e as equipes perdem horas começando pelo errado. Siga o caminho do seu código para fora e pare no primeiro lugar em que você não consegue mais ver a mensagem.

  1. O app tentou? Procure no log da aplicação a tentativa de envio e qualquer exceção. Procure uma tarefa que nunca foi criada, geralmente porque uma condição ou feature flag era falsa.
  2. O worker rodou? Procure tarefas travadas, falhas ou repetidas. Um worker de fila que não foi reiniciado depois de um deploy pode rodar código antigo, e uma política de repetição pode enviar duplicatas.
  3. O provedor aceitou? Consulte o destinatário ou o Message-ID no log de atividade do provedor. Aceito, adiado, devolvido e descartado são quatro histórias diferentes.
  4. Foi suprimido? Se esse endereço devolveu ou reclamou antes, muitos provedores ignoram em silêncio os envios futuros. Isso costuma pegar testadores que reutilizam um endereço antigo.
  5. O que o servidor receptor disse? Os logs do provedor geralmente mostram a resposta SMTP, e esse texto é a linha mais útil de toda a investigação.
  6. O DNS está certo? Confira SPF, DKIM e DMARC do domínio de envio real.
  7. Está lá, mas escondido? Pastas de spam, abas e filtros do cliente ficam por último, quando uma conta de teste pode mostrar a você.

O que a resposta SMTP está dizendo

Pela RFC 5321, uma resposta começando com 4 é uma falha temporária, e o remetente deve tentar de novo mais tarde. Uma resposta começando com 5 é permanente. Os códigos de status aprimorados da RFC 3463 acrescentam detalhes depois disso. Uma linha de log inventada poderia ser assim, apenas como exemplo do formato:

Apenas um exemplo: to=user@gmail.example status=bounced reply="550 5.7.26 unauthenticated sender"

Leia da esquerda para a direita. O 5 significa que tentar de novo não vai ajudar. A família 5.7 trata de segurança ou política, o que leva você ao DNS e à assinatura, e para longe do endereço do destinatário. A tabela abaixo dá um ponto de partida para os padrões comuns.

O que você vêCamada mais provávelPrimeiro lugar a olhar
Nada no log do provedorApp ou filaLogs da aplicação e tarefas com falha
O provedor diz "dropped" ou "suppressed"Lista de supressão do provedorRemova o endereço de teste ou use um novo
A API retorna sucesso, mas nada é registrado como enviadoModo sandbox ainda ligadoConfigurações do provedor para aquele ambiente
5.1.1 ou parecidoEndereço do destinatárioErros de digitação e validação de formulário que alterou o endereço
5.7.26 no GmailAutenticaçãoSPF, DKIM e alinhamento com o domínio do From
Adiamentos 4xx que passam depois de um tempoO receptor está desacelerando vocêVolume, reputação ou um novo IP de envio
Entregue em uma caixa externa, ausente no GmailPolítica ou filtragem do receptorContas de teste e as diretrizes de remetentes do Google
Chega, mas o link diz "já usado"Scanner que pré-carrega o linkResgate os tokens por POST, não por GET
O link leva a um aviso de segurançaDomínio de rastreamento de cliquesCertificado do subdomínio de rastreamento
Chega duas vezesLógica de repetiçãoIdempotência da tarefa e os timeouts que disparam repetições
Chega muito tardeFilaCapacidade do worker e se o e-mail de redefinição divide fila com o e-mail em massa

Essa última linha é um ponto de projeto que merece mais uma frase. Se as redefinições de senha dividem uma fila com o envio de uma newsletter, elas esperam atrás dele. Dê ao e-mail transacional a sua própria fila e, de preferência, o seu próprio subdomínio e fluxo de envio, para que um problema de marketing não atrase um login.

Comandos que encurtam a busca

Dá para conferir quase tudo isso sem sair do terminal. Nestes exemplos, troque os nomes de exemplo pelos seus.

  • dig +short MX example.com mostra onde um domínio recebe e-mail. Uma resposta vazia merece um olhar mais atento, pois a RFC 5321 permite que os remetentes recorram a um registro de endereço, enquanto uma resposta 0 . é um MX nulo pela RFC 7505, significando que o domínio não aceita e-mail algum.
  • dig +short TXT example.com mostra o registro SPF entre outros registros de texto.
  • dig +short TXT selector._domainkey.example.com mostra uma chave DKIM. Pegue o seletor real no valor de s= do cabeçalho DKIM-Signature da mensagem.
  • dig +short TXT _dmarc.example.com mostra a política DMARC.
  • openssl s_client -starttls smtp -connect smtp.example.com:587 verifica se você alcança o seu relay e mostra o certificado dele. Uma falha aqui significa um problema de firewall ou de TLS, muito antes de qualquer coisa sobre conteúdo.
  • swaks --to qa@example.test --from app@example.test --server localhost:1025 envia uma mensagem simples à mão. Ele ignora o seu app, então você consegue dizer se um problema é do seu código ou do caminho.

Para evidências no nível dos cabeçalhos, a visão mais confiável é uma caixa que você controla em um grande provedor. No Gmail, abra a mensagem, use o menu de três pontos e escolha Mostrar original, que lista os resultados de SPF, DKIM e DMARC no topo. Lembre-se de que o "pass" de um receptor não garante o de outro.

O que conferir em cada fluxo

"Chegou?" é a primeira pergunta, e geralmente a menos interessante. Cada fluxo tem as suas próprias maneiras de dar errado depois disso.

Redefinição de senha

A OWASP Forgot Password Cheat Sheet é a referência para construir sobre. Ela pede uma mensagem consistente, exista ou não uma conta, respostas com tempo uniforme, tokens aleatórios, longos, guardados com segurança e de uso único, e Referrer-Policy: no-referrer na página de redefinição.

  • A página de solicitação mostra a mesma mensagem para endereços cadastrados e não cadastrados, e leva mais ou menos o mesmo tempo. Uma resposta instantânea para endereços desconhecidos vaza tanto quanto o texto vazaria.
  • O link funciona uma vez. Abra-o uma segunda vez e você recebe uma explicação clara com um jeito de pedir outro.
  • Pedir uma nova redefinição invalida os links mais antigos, ou o seu projeto diz o contrário de propósito.
  • A expiração é aplicada pelo servidor e foi testada esperando, ou mudando a hora em um ambiente de teste.
  • Uma redefinição bem-sucedida envia um e-mail de confirmação, e as outras sessões são tratadas conforme a sua política.
  • Abrir o link não muda nada por si só. O token é resgatado quando o formulário é enviado.
  • A página de redefinição não envia a própria URL para análises ou rastreamento de erros de terceiros.
  • Os limites de taxa valem por conta e também por IP, para que ninguém consiga inundar a caixa de entrada de um desconhecido.
  • Endereços com maiúsculas e minúsculas misturadas ou com sinal de mais funcionam como os simples.

Verificação de cadastro

  • Um cadastro envia uma mensagem, inclusive quando a tarefa é repetida.
  • O link ou código funciona uma vez, e a página de link expirado oferece um caminho a seguir.
  • Um reenvio invalida o token anterior ou convive com ele conforme o projeto, e tem limite de taxa.
  • Contas não verificadas têm exatamente as restrições que você pretendia.
  • Cadastrar-se de novo com um endereço já registrado não informa a um visitante anônimo que a conta existe, se o seu produto trata isso como sensível. Um padrão comum é enviar um e-mail ao dono existente.
  • O link aponta para o ambiente correto. Uma mensagem de staging com link para a produção vai, cedo ou tarde, alterar dados da produção.

Códigos de login e magic links

  • Os códigos são longos o bastante, expiram rápido e têm limite de tentativas.
  • Os magic links mostram uma página de destino com um botão e resgatam nesse POST, para que o GET de um scanner não cause dano.
  • Abrir o link em outro dispositivo faz o que o seu projeto diz, e o usuário consegue entender o que aconteceu.
  • O assunto traz um código apenas se você decidiu que isso é aceitável, já que as notificações o exibem na tela de bloqueio.

Troca de endereço de e-mail

  • A confirmação vai para o novo endereço, e nada muda até ser confirmada.
  • Um aviso vai para o endereço antigo, para que o dono de verdade possa reagir a uma mudança não autorizada.
  • Tokens de redefinição pendentes deixam de funcionar depois da troca.
  • Duas caixas temporárias deixam este caso rápido de executar à mão.

Convites, recibos e notificações

  • Um convite para uma pessoa sem conta leva ao cadastro com o endereço preenchido ou travado, conforme o projeto. Um convite expirado ou revogado diz isso.
  • Um convite não pode ser aceito por outra conta, a menos que o seu projeto permita.
  • Os recibos mostram valores, moedas, datas e fusos horários corretos para a localidade do usuário, e os anexos têm nomes sensatos e abrem direito.
  • As mudanças de preferências valem a partir do próximo envio.
  • Os e-mails não essenciais têm um cancelamento de inscrição funcionando, e os e-mails de conta e de segurança são claramente separados. Nosso artigo sobre o excesso de newsletters mostra como isso fica do lado de quem lê.
  • Existem modelos traduzidos para cada idioma suportado, com layout da direita para a esquerda correto onde for relevante, e sem fragmentos sem tradução no assunto.

Revisando o código dos tokens

Testar por uma caixa de entrada mostra o comportamento. Uma revisão de código curta pega falhas de projeto que nenhuma caixa de entrada mostrará. Ao ler o código por trás da redefinição, da verificação e dos magic links, procure o seguinte.

  • A fonte de aleatoriedade. Deve ser um gerador criptograficamente seguro, como secrets.token_urlsafe(32) em Python, crypto.randomBytes(32) em Node ou random_bytes(32) em PHP. Um timestamp, um ID incremental ou um hash do e-mail não é aceitável.
  • Tamanho. Os tokens de link costumam ter pelo menos 128 bits de aleatoriedade. Um código de seis dígitos só serve com expiração curta e limite de tentativas.
  • Armazenamento. Guarde um hash do token, para que o vazamento do banco de dados não entregue links de redefinição funcionando.
  • Comparação. Use uma função de tempo constante, como hmac.compare_digest, hash_equals ou crypto.timingSafeEqual, onde você compara valores secretos diretamente.
  • Finalidade. Um token de verificação não pode funcionar como token de redefinição, e o token de uma conta não pode funcionar em outra.
  • Expiração. O servidor guarda o horário de expiração, de modo que ele não pode ser alterado editando o link.
  • Invalidação. O uso do token, uma troca de senha por outra via ou uma troca de e-mail devem cancelar os tokens pendentes.
  • Registro em log. URLs completas com tokens não devem chegar a logs da aplicação, eventos de análise ou rastreadores de erros. Confira também os logs de acesso HTTP.

Cabeçalhos e autenticação

Abra o código-fonte bruto em um capturador para ver o que o seu app produziu, e em uma caixa que você controla em um grande provedor para ver o que o provedor e a rede acrescentaram.

Cabeçalho ou elementoO que verificar
FromO nome correto da marca, em um domínio que você possui e autentica
Reply-ToUma caixa monitorada, ou omitido de propósito
Return-PathO domínio de devolução, alinhado com o seu domínio se você depende do SPF para o DMARC
DKIM-SignaturePresente, com um domínio d= alinhado com o domínio do From
Message-IDPresente e único, pois é a sua chave para rastrear nos logs do provedor
Content-Typemultipart/alternative com partes HTML e texto simples
List-Unsubscribe, List-Unsubscribe-PostPresentes em e-mails em massa e de marketing, com suporte a cancelamento com um clique pela RFC 8058
Auto-Submittedauto-generated nos e-mails automáticos, como definido na RFC 3834, para ajudar a evitar laços de resposta

Algumas regras para conferir antes de lançar um novo domínio de envio. Uma avaliação de SPF não pode passar de dez consultas DNS (RFC 7208), e ultrapassar o limite é um jeito fácil de falhar depois de acrescentar mais um fornecedor ao seu registro. O DKIM precisa que o registro do seletor do provedor esteja publicado e sendo verificado. O DMARC precisa de um registro no seu domínio do From, geralmente começando em p=none com os relatórios ligados e endurecido depois que o alinhamento for confirmado.

O volume também muda as regras. As diretrizes do Google tratam um remetente como em massa a partir de cerca de 5.000 mensagens por dia para contas pessoais do Gmail, e remetentes em massa precisam de SPF, DKIM e DMARC, cancelamento com um clique nos e-mails promocionais e uma taxa de spam denunciado pelos usuários mantida abaixo de 0,3%, com 0,1% como meta recomendada. Outros provedores têm as suas próprias regras. O Amazon SES, por exemplo, coloca uma conta em revisão com uma taxa de devolução de 5% ou uma taxa de reclamação de 0,1%. Leia os números atuais na documentação do seu provedor antes de planejar em torno deles, pois eles mudam.

Tratamento e validação de endereços

Os formulários rejeitam endereços válidos com mais frequência do que as pessoas percebem, e um bug de validação anterior pode parecer exatamente uma falha de entrega. Teste o seu com estes.

EntradaTratamento esperadoBug comum
user+tag@example.comAceitarUma expressão regular rejeita o sinal de mais
User@Example.COMAceitar e tratar o domínio sem distinguir maiúsculas de minúsculasContas duplicadas que diferem só pelas maiúsculas
o'brien@example.comAceitarRejeitado, ou quebra uma consulta ou modelo se não for escapado
first.last@sub.example.co.ukAceitarA validação presume um único ponto no domínio
Espaços no início ou no fimRemover primeiro"E-mail inválido" numa colagem correta
Um endereço muito longoAplicar 64 caracteres para a parte local e 254 no totalUma coluna curta do banco de dados o trunca em silêncio
Domínios e endereços internacionalizadosAceitar ou recusar de forma consistente, com uma mensagem claraUma falha na codificação ou no log
Um domínio sem rota de e-mailAvisar ou rejeitarUma conta que nunca poderá ser verificada

Valide de forma flexível no formulário e deixe o e-mail de confirmação provar que o endereço funciona. Uma expressão regular rígida faz você perder usuários reais e diz muito pouco sobre se uma caixa existe.

Se o seu produto recusa domínios descartáveis na produção, o seu processo de QA ainda precisa de um caminho no staging. As opções incluem uma lista de permissão de domínios de teste fora da produção, uma flag que desativa a verificação em ambientes de teste ou o seu próprio domínio de teste. Não enfraqueça a regra da produção para facilitar os testes. E se você está decidindo se deve ter essa regra, nosso texto sobre por que os sites bloqueiam e-mails descartáveis expõe os custos e benefícios do ponto de vista de quem é dono do site.

Como ele é renderizado

A renderização é onde a revisão de um designer mais ajuda, e exige mensagens reais em clientes reais.

  • A parte em texto simples é legível e inclui o link completo. "Clique no botão abaixo" é inútil ali.
  • O modo escuro deixa os logotipos visíveis e mantém o contraste. O VookMail tem modo escuro, o que é um começo, e os clientes preferidos dos seus usuários são o teste de verdade.
  • Com as imagens bloqueadas, a chamada para ação ainda é um link de texto de verdade ou um botão HTML.
  • Os botões são grandes o bastante para tocar, e URLs longas não quebram o layout no celular.
  • O texto de prévia é escrito de propósito, sem sobras de texto do modelo.
  • Os títulos são semânticos, o contraste é suficiente, o texto dos links é descritivo e o HTML tem um atributo de idioma.
  • Dados ausentes não geram "Olá {first_name}" nem "Olá ,".
  • O tamanho da mensagem fica bem abaixo de cerca de 102 KB, o ponto em que, segundo relatos amplos, o Gmail corta mensagens longas. O corte pode esconder o seu rodapé e qualquer link de cancelamento no corpo.

Proteções contra acidentes

Os incidentes constrangedores de e-mail são em sua maioria erros de configuração: e-mail do staging chegando a clientes reais, a produção com uma chave de teste, links para localhost. Algumas configurações evitam a maioria deles.

Mantenha credenciais separadas por ambiente, em variáveis de ambiente ou em um gerenciador de segredos. Fora da produção, use uma lista de permissão de destinatários para que o mailer entregue apenas a domínios de teste aprovados e redirecione ou descarte todo o resto. Monte todos os links a partir de uma única configuração, como APP_URL, para que os modelos não contenham hosts fixos no código. Coloque nos assuntos fora da produção um prefixo como [STAGING], para que uma mensagem enviada ao lugar errado seja óbvia para quem a receber.

Se você copia dados da produção para o staging, troque todo endereço real por um sintético antes de qualquer worker de e-mail iniciar. A ordem importa, porque um worker que inicia primeiro pode começar a processar imediatamente os e-mails agendados. E acompanhe o modo sandbox de cada ambiente de forma deliberada. Lançar com a produção ainda em sandbox é um clássico: a API retorna sucesso, os logs parecem limpos e nenhum e-mail sai.

As suítes automatizadas devem ficar em infraestrutura que você controla

Uma caixa temporária pública é a dependência errada para o CI. Extrair dados da página de outra pessoa é frágil, e as suas builds falhariam por razões sem relação com o seu código. Também coloca o seu tráfego de teste em um serviço que você não opera. As mensagens ali podem ser lidas por qualquer pessoa com o endereço, então nada automatizado deve depender delas.

Um arranjo sensato é assim. Os auxiliares do framework verificam que o e-mail certo é solicitado. Um contêiner do Mailpit na sua pilha de testes recebe a mensagem de verdade, e o seu teste a lê pela API HTTP do Mailpit (GET /api/v1/messages), extrai o link e o segue. O modo de teste do provedor exercita webhooks e o tratamento de erros. Uma tarefa noturna no seu próprio domínio de teste envia pelo provedor real e lê o resultado por um webhook de entrada, de modo que você recebe um sinal diário de que a entrega real ainda funciona.

O e-mail temporário pertence às partes humanas do teste: sessões exploratórias em que você precisa rapidamente de uma identidade nova, um teste rápido antes do lançamento, a reprodução do relato de um usuário, revisões de texto e de design e testes no celular. Para este último, o botão de QR ou o app do Google Play ou da Huawei AppGallery leva a caixa para um dispositivo de teste. Confira se os links abrem o seu app quando ele está instalado e recorrem a uma página web funcional quando não está, e se o app percebe o status verificado sem exigir um novo login.

Um caso de teste que sobrevive a uma passagem de bastão

Casos de teste consistentes são mais fáceis de repetir a cada lançamento e de passar entre testadores. Este exemplo tem os campos que costumam importar.

CampoExemplo
ID do testeEMAIL-RESET-03
FluxoRedefinição de senha, reutilização do token
Pré-condiçõesConta de teste verificada no staging, com um endereço temporário novo
PassosPedir uma redefinição, abrir o link, definir uma nova senha, abrir o mesmo link de novo
Resultado esperadoO segundo uso explica que o link não é mais válido e oferece um novo pedido
EvidênciasCapturas de tela, Message-ID se disponível, horários, endereço usado
AmbienteNúmero da build do staging e configuração de e-mail

Colocar o ID do teste no nome de usuário, como em email-reset-03-x7, liga cada caixa ao seu caso e impede que dois testadores esbarrem em um mesmo endereço. O curto sufixo aleatório está ali porque qualquer pessoa pode abrir uma caixa se adivinhar o nome.

O que não enviar a uma caixa pública

Trate qualquer caixa temporária como legível por quem conhecer o endereço e teste de acordo.

  • Envie apenas dados sintéticos: nomes falsos, pedidos falsos, endereços falsos. Dados reais de clientes não pertencem a esse lugar e, dependendo de onde você atua, enviá-los também pode criar um problema legal para você.
  • Nunca envie chaves de API, credenciais de banco de dados nem convites de administrador de sistemas reais.
  • Exclua contas de teste regularmente, principalmente as privilegiadas. Um usuário administrador de teste ligado a uma caixa pública é uma porta de entrada se outra pessoa abrir essa caixa e pedir uma redefinição. Como o endereço não fica reservado para você depois de limpo, esse risco persiste após o teste.
  • Nunca use um endereço temporário como dono de uma conta de produção real ou de um serviço de terceiros de que a sua empresa dependa.
  • Conheça o período de retenção. Mensagens e anexos somem depois de cerca de um dia, e a política de privacidade traz os detalhes.

Testar o seu próprio produto é um dos usos legítimos mais claros do e-mail descartável. Mantenha assim: teste sistemas que você possui ou está autorizado a testar. Não use caixas temporárias para criar contas em serviços de outras empresas contra os termos delas, para juntar períodos de teste ou para fazer teste de carga no formulário de cadastro de outra pessoa. Os termos e condições tratam do uso aceitável, e a página de metodologia explica como o serviço funciona. O VookMail faz parte da rede PAYATE de ferramentas gratuitas.

Antes de lançar

  1. SPF, DKIM e DMARC verificados para o domínio de envio real da produção, com o domínio do From alinhado.
  2. Mailer da produção com as credenciais de produção, com o modo sandbox desligado, confirmado por uma mensagem real.
  3. Verificação de cadastro recebida em um endereço externo novo, link usado uma vez, expiração testada.
  4. Redefinição de senha testada de ponta a ponta, incluindo respostas idênticas para endereços desconhecidos e a mensagem de confirmação.
  5. Tokens de redefinição e de magic link resgatados no envio de um formulário, para que o GET de um scanner não os consuma.
  6. A troca de e-mail envia para o endereço novo e para o antigo.
  7. Todos os links apontam para o host de produção por HTTPS, incluindo os reescritos pelo rastreamento de cliques.
  8. E-mail transacional separado do e-mail em massa, pelo menos na fila.
  9. HTML e texto simples presentes e legíveis, com o modo escuro e as imagens bloqueadas conferidos.
  10. Uma verificação de colocação em contas de teste se o domínio ou o modelo mudou de forma significativa.
  11. Cancelamento de inscrição funcionando nos e-mails não essenciais e modelos traduzidos revisados.
  12. Evidências anexadas ao chamado do lançamento, e números de devoluções e reclamações em um painel que alguém vá acompanhar depois do lançamento.

Perguntas que os desenvolvedores fazem sobre isso

Uma caixa real aceitou meu e-mail. Estou seguro no Gmail?

Não. A entrega em um domínio mostra que a sua mensagem saiu, encontrou uma rota e foi aceita ali. O Gmail aplica as suas próprias regras de autenticação e filtragem, e todo outro grande provedor também. Use contas de teste e o Postmaster Tools do Google para essa pergunta.

Posso reutilizar o mesmo endereço de teste?

Pode dentro de uma mesma sessão, mas um endereço novo dá um teste mais limpo. Endereços antigos acumulam entradas de supressão e mensagens velhas e, em um serviço temporário, a caixa é limpa depois de cerca de um dia de qualquer jeito.

O e-mail chega ao meu capturador, mas não a um endereço externo. Por onde começar?

Um capturador mostra que o seu app produziu uma mensagem e nada além disso, então comece pelo log de atividade do provedor. Na maioria das vezes, a resposta é uma configuração de sandbox, uma entrada de supressão, credenciais erradas ou uma rejeição SMTP que menciona autenticação.

Por quanto tempo um link de redefinição deve ficar válido?

Curto o bastante para limitar o dano e longo o bastante para que um e-mail lento chegue. Muitas equipes ficam entre 15 minutos e uma hora, mas depende do seu risco e da rapidez com que o seu e-mail é entregue, e o e-mail dos seus usuários pode atrasar além do seu controle. Seja qual for a sua escolha, teste o estado expirado e diga às pessoas o que fazer em seguida.