# Firebase Auth com SMTP ou API

> E-mails do Firebase Auth (verificação e redefinição de senha) chegando pelo Couryo, por SMTP nas configurações do Auth, pela extensão de e-mail do Firestore ou gerando o link no backend.

Fonte: https://couryo.com/docs/firebase

Três caminhos, do mais simples ao mais flexível. Antes de qualquer um: [verifique o domínio](https://couryo.com/docs/domains.md) no Couryo e crie uma chave de API com escopo `send`.

| Caminho | Bom quando |
|---|---|
| **1. SMTP nas configurações do Auth** | você quer manter os modelos do Firebase e só mudar quem entrega |
| **2. Extensão de e-mail do Firestore** | o app já grava documentos e você quer mandar e-mails de produto por ali |
| **3. Gerar o link no backend** | você quer o e-mail inteiro do seu jeito (HTML, idioma, marca, idempotência) |

## 1. SMTP nas configurações do Auth

No console do Firebase, em **Authentication > Templates**, abra **SMTP settings**, ative e preencha:

| Campo | Valor |
|---|---|
| Sender address | um endereço do domínio verificado, como `nao-responda@exemplo.com.br` |
| SMTP server host | `smtp.couryo.com` |
| Port | `587` |
| Username | `couryo` |
| Password | a chave de API (`ck_live_...`) |
| SMTP security mode | `STARTTLS` (ou `SSL` com a porta `465`) |

Os e-mails de verificação, redefinição de senha e troca de e-mail passam a sair pelo Couryo, com a linha do tempo de cada um no painel. Edite os textos em **Templates**: escreva o nome do app no assunto e no corpo.

## 2. Extensão "Trigger Email from Firestore"

Instale a extensão oficial de envio por Firestore e, na configuração:

| Parâmetro | Valor |
|---|---|
| SMTP connection URI | `smtps://couryo@smtp.couryo.com:465` |
| SMTP password | a chave de API (guardada como segredo da extensão) |
| Email documents collection | `mail` |
| Default FROM address | `Exemplo <nao-responda@exemplo.com.br>` |

Para enviar, grave um documento:

```ts title="TypeScript"
import { addDoc, collection, getFirestore } from "firebase/firestore";

await addDoc(collection(getFirestore(), "mail"), {
  to: ["ana@exemplo.com.br"],
  message: {
    subject: "Seu pedido saiu para entrega",
    text: "Oi, Ana! O pedido 1042 foi enviado.",
    html: "<p>Oi, Ana! O pedido <strong>1042</strong> foi enviado.</p>",
  },
});
```

A extensão atualiza o documento com o resultado (`delivery.state`). Proteja a coleção nas regras do Firestore: só o seu backend deveria poder gravar nela.

## 3. Gerar o link no backend e enviar pela API

O Admin SDK gera o mesmo link que o Firebase mandaria. Você envia com o seu HTML, no idioma da pessoa, com uma chave de idempotência:

```ts title="functions/src/verificacao.ts"
import { getAuth } from "firebase-admin/auth";
import { Couryo } from "@couryo/node";

const couryo = new Couryo(); // COURYO_API_KEY

export async function enviarVerificacao(uid: string) {
  const usuario = await getAuth().getUser(uid);
  const link = await getAuth().generateEmailVerificationLink(usuario.email!, { url: "https://exemplo.com.br/entrar" });

  await couryo.emails.send(
    {
      from: "Exemplo <nao-responda@exemplo.com.br>",
      to: usuario.email!,
      subject: "Confirme o seu e-mail no Exemplo",
      html: `<p>Oi! Confirme que este endereço é seu para entrar no Exemplo.</p><p><a href="${link}">Confirmar e-mail</a></p>`,
      text: `Oi! Confirme que este endereço é seu para entrar no Exemplo: ${link}`,
    },
    { idempotencyKey: `verificacao-${uid}` },
  );
}
```

Para a senha, use `generatePasswordResetLink(email)`. Chame a função num gatilho de criação de usuário ou numa rota sua.

## Problemas comuns

| Sintoma | O que fazer |
|---|---|
| Nada chega e nenhum erro no app | veja o envio em **E-mails** no painel do Couryo; se não estiver lá, o Firebase não conseguiu entregar ao SMTP (confira host, porta e senha) |
| `550 5.7.1` | o remetente não está num domínio verificado, ou a conta ainda está no nível 0 |
| Link "inválido ou expirado" | o link é de uso único: algum filtro corporativo pode ter aberto antes. Gere um novo e, se acontecer sempre com um domínio, use o caminho 3 com uma tela intermediária de confirmação |
| Cai no spam | veja [Por que meu e-mail cai no spam](https://couryo.com/guias/email-caindo-no-spam.md) |
