# E-mail de confirmação não chega (Supabase, Firebase, WordPress)

> Por que o e-mail de confirmação de cadastro não chega, o que conferir primeiro e como resolver no Supabase Auth, no Firebase Auth e no WordPress, com SMTP próprio e domínio autenticado.

Fonte: https://couryo.com/guias/email-de-confirmacao-nao-chega · Atualizado em 2026-10-08

A pessoa se cadastra, vê "enviamos um link para o seu e-mail" e nada chega. Ela tenta de novo, desiste, e você perde o cadastro sem nem saber. Na maior parte das vezes, a causa é uma destas cinco, e dá para descobrir qual em poucos minutos.

## As 5 causas mais comuns

1. **O serviço de e-mail embutido não serve para produção.** Supabase, Firebase e WordPress vêm com um envio padrão pensado para testar, com limites baixos ou um remetente genérico que os filtros não conhecem.
2. **O domínio do remetente não está autenticado.** Sem SPF, DKIM e DMARC alinhados, o e-mail cai no spam ou é recusado. Veja [Como configurar SPF, DKIM e DMARC](https://couryo.com/guias/spf-dkim-dmarc.md).
3. **Um limite de envio foi atingido.** O próprio sistema de autenticação tem limite de e-mails por hora; quem testa muitas vezes seguidas bate nele.
4. **O link aponta para o lugar errado.** A URL do site configurada é `localhost` ou outro domínio, e o link "não funciona".
5. **Um filtro abriu o link antes da pessoa.** Alguns provedores corporativos visitam os links para checar segurança. Se o link é de uso único, quando a pessoa clica ele já foi gasto.

## Primeiro: descubra onde o e-mail parou

| Pergunta | Onde olhar |
|---|---|
| O app chegou a pedir o envio? | logs do seu backend ou do sistema de autenticação |
| O servidor de envio aceitou? | o painel ou o log do serviço de SMTP ou da API (procure pelo destinatário) |
| O servidor de destino aceitou? | a resposta SMTP do destino: `250` é aceito; `4xx` é adiado; `5xx` é recusado |
| Chegou e foi para o spam? | peça à pessoa para procurar na caixa de spam e nas abas do Gmail |

Se o e-mail nem saiu do app, o problema é de configuração ou de limite. Se saiu e voltou com erro, o código diz o motivo: veja os [códigos de devolução SMTP](https://couryo.com/guias/codigos-de-erro-smtp.md). Se foi entregue e a pessoa não acha, é filtro de spam.

## Supabase Auth

O e-mail embutido do Supabase tem limite de envio por hora bem baixo e, em projetos novos, só entrega para endereços da equipe do projeto. Em produção, ligue um **SMTP personalizado**:

1. Verifique o domínio no seu serviço de envio e crie a credencial SMTP.
2. Em **Authentication > Emails > SMTP Settings**, ligue **Enable Custom SMTP** e preencha remetente (no domínio verificado), servidor, porta, usuário e senha.
3. Em **Authentication > Rate Limits**, ajuste o limite de e-mails por hora ao seu volume.
4. Em **Authentication > URL Configuration**, confira o **Site URL** e as **Redirect URLs**.
5. Teste e veja **Logs > Auth**: erros de SMTP aparecem ali, com o código.

O passo a passo com os valores do Couryo, incluindo a CLI e a API de gerenciamento, está no guia [Supabase Auth com SMTP personalizado](https://couryo.com/docs/supabase.md).

## Firebase Auth

Por padrão, o Firebase envia de um endereço do domínio do projeto no Firebase, que não é o seu. Para o e-mail sair do seu domínio:

- configure o **SMTP** em **Authentication > Templates > SMTP settings**, com remetente no seu domínio verificado; ou
- gere o link no backend com o Admin SDK (`generateEmailVerificationLink`) e envie você mesmo, com o seu HTML.

Os dois caminhos, com código, estão em [Firebase Auth](https://couryo.com/docs/firebase.md).

## WordPress

O WordPress envia pela função `mail()` da hospedagem, sem a autenticação do seu domínio. É a causa mais comum de "o e-mail de cadastro e de senha do site não chega". Instale um plugin de SMTP (ou use o gancho `phpmailer_init`), aponte para um serviço autenticado e force o remetente no seu domínio. Passo a passo em [WordPress e WooCommerce](https://couryo.com/docs/wordpress.md).

## Quando o link chega "inválido ou expirado"

Se o e-mail chega mas o link já não funciona quando a pessoa clica, quase sempre é um filtro corporativo que visitou o link antes. Três saídas:

- **Código de 6 dígitos** no lugar do link (o Supabase oferece `{{ .Token }}` nos modelos);
- **página intermediária com um botão** "Confirmar e-mail": a visita do filtro só abre a página, e a confirmação acontece no clique (um POST);
- links com validade razoável e a opção de pedir outro na própria tela.

## O texto do e-mail também conta

- **Assunto claro e com o nome do app:** "Confirme o seu e-mail no Exemplo".
- **Remetente reconhecível:** "Exemplo <nao-responda@exemplo.com.br>", sempre no mesmo domínio do site.
- **Parte em texto** além do HTML, e o link escrito por extenso como alternativa ao botão.
- **Sem encurtador de link**, sem propaganda e sem imagem pesada.
- Uma linha dizendo por que a pessoa recebeu e o que fazer se não foi ela.

## Onde o Couryo entra

O Couryo funciona como o SMTP personalizado do Supabase, do Firebase e do WordPress (servidor `smtp.couryo.com`, usuário `couryo` e a chave de API como senha). Cada e-mail de confirmação aparece numa linha do tempo com a resposta do servidor de destino, e quando um provedor recusa, a explicação diz por quê em português. Com uma chave de teste, dá para testar o fluxo inteiro sem entregar nada. Veja o [início rápido](https://couryo.com/docs/quickstart.md).

## Perguntas frequentes

### Por que o e-mail de confirmação chega para mim e não para os clientes?

No Supabase, o envio embutido só entrega para endereços da equipe do projeto. Em outros casos, você está testando com o mesmo provedor sempre (o seu Gmail, por exemplo) e o problema aparece em outro (Outlook, e-mail corporativo). Teste com endereços de provedores diferentes.

### O e-mail de confirmação demora muito para chegar. É normal?

Não. Confirmação deveria chegar em segundos. Atraso de minutos ou horas costuma ser o provedor adiando a entrega (resposta `4xx`) por volume ou reputação, ou uma fila travada no seu sistema. A resposta do servidor de destino mostra qual dos dois.

### Posso desligar a confirmação de e-mail para não perder cadastros?

Pode, mas a lista passa a ter endereços digitados errado e falsos, que voltam como devolução e derrubam a reputação do domínio. O melhor é fazer a confirmação chegar.

### Preciso de um domínio próprio para enviar?

Para produção, sim. Enviar de um domínio genérico (do serviço de autenticação ou de um provedor gratuito) deixa a mensagem sem autenticação alinhada e reconhecimento da marca, e é onde os filtros mais desconfiam.
