Pular para o conteúdo
couryo

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.

Ver em Markdown

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:

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.

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:

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