Guia do desenvolvedorIntegrações
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.
Três caminhos, do mais simples ao mais flexível. Antes de qualquer um: verifique o domínio 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:
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:
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 |