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.
// 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
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:
{
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.