Integrações

Better Auth

Verificação de e-mail, redefinição de senha e magic link do Better Auth enviados pela API da Postal.

O Better Auth deixa o envio dos e-mails com você: basta chamar o POST /emails da Postal nos callbacks. Não há conexão para criar.

#Chave e remetente

Crie uma chave só de envio em Chaves de API e guarde em POSTAL_API_KEY. O remetente precisa ser de um domínio verificado.

Envio pela Postal
// lib/postal.ts
export async function sendWithPostal(to: string, subject: string, html: string) {
  const response = await fetch('https://api.postal.so/emails', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.POSTAL_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      from: 'Minha empresa <[email protected]>',
      to: [to],
      subject,
      html,
    }),
  })

  if (!response.ok) {
    throw new Error(`Postal respondeu ${response.status}: ${await response.text()}`)
  }
}

#Verificação, senha e magic link

auth.ts
import { betterAuth } from 'better-auth'
import { magicLink } from 'better-auth/plugins'
import { sendWithPostal } from './lib/postal'

export const auth = betterAuth({
  emailAndPassword: {
    enabled: true,
    requireEmailVerification: true,
    sendResetPassword: async ({ user, url }) => {
      await sendWithPostal(user.email, 'Redefina sua senha', `<p><a href="${url}">Criar nova senha</a></p>`)
    },
  },
  emailVerification: {
    sendOnSignUp: true,
    sendVerificationEmail: async ({ user, url }) => {
      await sendWithPostal(user.email, 'Confirme seu e-mail', `<p><a href="${url}">Confirmar e-mail</a></p>`)
    },
  },
  plugins: [
    magicLink({
      sendMagicLink: async ({ email, url }) => {
        await sendWithPostal(email, 'Seu link de acesso', `<p><a href="${url}">Entrar</a></p>`)
      },
    }),
  ],
})

#Com templates da Postal

Para editar os e-mails no painel em vez do código, crie um template com a variável {{{URL}}} e envie com template no lugar de html:

Corpo do POST /emails
{
  from: 'Minha empresa <[email protected]>',
  to: [user.email],
  template: { id: 'confirmar-email', variables: { URL: url } },
}

Para também levar os cadastros para a audiência e disparar automações, chame POST /events no databaseHooks.user.create.after do Better Auth, com o ID do usuário em external_id. Veja o guia Integre seu app.