Better Auth
Verificación de correo electrónico, restablecimiento de contraseña y magic link de Better Auth enviados por la API de Postal.
Better Auth deja el envío de los correos electrónicos en tus manos: basta con llamar a POST /emails de Postal en los callbacks. No hay ninguna conexión que crear.
#Clave y remitente
Crea una clave solo de envío en Claves de API y guárdala en POSTAL_API_KEY. El remitente debe ser de un dominio 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()}`)
}
}
#Verificación, contraseña y 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>`)
},
}),
],
})
#Con plantillas de Postal
Para editar los correos electrónicos en el panel en lugar de en el código, crea una plantilla con la variable {{{URL}}} y envía con template en lugar de html:
{
from: 'Minha empresa <[email protected]>',
to: [user.email],
template: { id: 'confirmar-email', variables: { URL: url } },
}
Para llevar también los registros a la audiencia y disparar automatizaciones, llama a POST /events en el databaseHooks.user.create.after de Better Auth, con el ID del usuario en external_id. Consulta la guía Integra tu app.