feat(email): adota React Email em notificações e automações

This commit is contained in:
esdrasrenan 2025-12-13 13:11:41 -03:00
parent 58a1ed6b36
commit 4306b0504d
18 changed files with 940 additions and 337 deletions

View file

@ -0,0 +1,96 @@
import * as React from "react"
import dotenv from "dotenv"
import { render } from "@react-email/render"
import { sendSmtpMail } from "@/server/email-smtp"
import AutomationEmail, { type AutomationEmailProps } from "../emails/automation-email"
dotenv.config({ path: ".env.local" })
dotenv.config({ path: ".env" })
type CliArgs = {
to: string
subject: string
}
function parseArgs(argv: string[]): CliArgs {
const args = argv.slice(2)
const get = (key: string) => {
const idx = args.findIndex((a) => a === key)
if (idx === -1) return null
return args[idx + 1] ?? null
}
return {
to: get("--to") || process.env.TEST_EMAIL_TO || "monkeyesdras@gmail.com",
subject: get("--subject") || "Teste de e-mail — React Email (Raven)",
}
}
function getSmtpConfig() {
const host = process.env.SMTP_HOST
const port = process.env.SMTP_PORT
const username = process.env.SMTP_USER
const password = process.env.SMTP_PASS
const fromEmail = process.env.SMTP_FROM_EMAIL
const fromName = process.env.SMTP_FROM_NAME ?? "Raven"
if (!host || !port || !username || !password || !fromEmail) return null
return {
host,
port: Number(port),
username,
password,
from: `"${fromName}" <${fromEmail}>`,
tls: process.env.SMTP_SECURE === "true",
rejectUnauthorized: false,
timeoutMs: 15000,
}
}
function buildTestEmailProps(subject: string): AutomationEmailProps {
const baseUrl = process.env.NEXT_PUBLIC_APP_URL || process.env.APP_BASE_URL || "http://localhost:3000"
return {
title: subject,
message:
"Olá!\n\nEste é um e-mail de teste gerado pelo React Email, usando o design do Raven.\n\nSe você recebeu esta mensagem, o SMTP está funcionando corretamente.",
ticket: {
reference: 99999,
subject: "Teste de automação (envio de e-mail)",
companyName: "Cliente de Teste",
status: "PENDING",
priority: "MEDIUM",
requesterName: "Solicitante",
assigneeName: "Administrador",
},
ctaLabel: "Abrir Raven",
ctaUrl: `${baseUrl}/login`,
preview: "Teste de e-mail do Raven",
}
}
async function main() {
const { to, subject } = parseArgs(process.argv)
const smtp = getSmtpConfig()
if (!smtp) {
console.error(
"SMTP não configurado. Defina SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM_EMAIL (e opcionalmente SMTP_FROM_NAME/SMTP_SECURE)."
)
process.exit(1)
}
const props = buildTestEmailProps(subject)
const html = await render(<AutomationEmail {...props} />, { pretty: true })
await sendSmtpMail(smtp, to, subject, html)
console.log(`OK: e-mail enviado para ${to}`)
}
main().catch((error) => {
console.error("Falha ao enviar e-mail de teste:", error)
process.exit(1)
})