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" import SimpleNotificationEmail, { type SimpleNotificationEmailProps } from "../emails/simple-notification-email" dotenv.config({ path: ".env.local" }) dotenv.config({ path: ".env" }) 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, } } type EmailScenario = { name: string subject: string render: () => Promise } const baseUrl = process.env.NEXT_PUBLIC_APP_URL || "https://tickets.esdrasrenan.com.br" const scenarios: EmailScenario[] = [ { name: "Ticket Criado", subject: "[TESTE] Novo chamado #41025 aberto", render: async () => { const props: SimpleNotificationEmailProps = { title: "Novo chamado #41025 aberto", message: "Seu chamado foi registrado com sucesso. Nossa equipe irá analisá-lo em breve.\n\nAssunto: Computador reiniciando sozinho\nPrioridade: Alta\nStatus: Pendente", ctaLabel: "Ver chamado", ctaUrl: `${baseUrl}/portal/tickets/test123`, } return render(, { pretty: true }) }, }, { name: "Ticket Resolvido", subject: "[TESTE] Chamado #41025 foi encerrado", render: async () => { const props: SimpleNotificationEmailProps = { title: "Chamado #41025 encerrado", message: "O chamado 'Computador reiniciando sozinho' foi marcado como concluído.\n\nCaso necessário, você pode responder pelo portal para reabrir dentro do prazo.", ctaLabel: "Ver detalhes", ctaUrl: `${baseUrl}/portal/tickets/test123`, } return render(, { pretty: true }) }, }, { name: "Novo Comentário", subject: "[TESTE] Atualização no chamado #41025", render: async () => { const props: SimpleNotificationEmailProps = { title: "Nova atualização no seu chamado #41025", message: "Um novo comentário foi adicionado ao chamado 'Computador reiniciando sozinho'.\n\nClique abaixo para visualizar e responder pelo portal.", ctaLabel: "Abrir e responder", ctaUrl: `${baseUrl}/portal/tickets/test123`, } return render(, { pretty: true }) }, }, { name: "Automação - Mudança de Prioridade", subject: "[TESTE] Prioridade alterada no chamado #41025", render: async () => { const props: AutomationEmailProps = { title: "Prioridade alterada para Urgente", message: "A prioridade do seu chamado foi alterada automaticamente pelo sistema.\n\nIsso pode ter ocorrido devido a regras de SLA ou categorização automática.", ticket: { reference: 41025, subject: "Computador reiniciando sozinho", companyName: "Paulicon Contabil", status: "AWAITING_ATTENDANCE", priority: "URGENT", requesterName: "Renan", assigneeName: "Administrador", }, ctaLabel: "Ver chamado", ctaUrl: `${baseUrl}/portal/tickets/test123`, } return render(, { pretty: true }) }, }, { name: "Automação - Atribuição de Agente", subject: "[TESTE] Agente atribuído ao chamado #41025", render: async () => { const props: AutomationEmailProps = { title: "Agente atribuído ao seu chamado", message: "O agente Administrador foi automaticamente atribuído ao seu chamado e entrará em contato em breve.", ticket: { reference: 41025, subject: "Computador reiniciando sozinho", companyName: "Paulicon Contabil", status: "AWAITING_ATTENDANCE", priority: "HIGH", requesterName: "Renan", assigneeName: "Administrador", }, ctaLabel: "Ver chamado", ctaUrl: `${baseUrl}/portal/tickets/test123`, } return render(, { pretty: true }) }, }, { name: "Redefinição de Senha", subject: "[TESTE] Redefinição de senha - Raven", render: async () => { const props: SimpleNotificationEmailProps = { title: "Redefinição de Senha", message: "Recebemos uma solicitação para redefinir a senha da sua conta.\n\nSe você não fez essa solicitação, pode ignorar este e-mail.\n\nEste link expira em 1 hora.", ctaLabel: "Redefinir Senha", ctaUrl: `${baseUrl}/redefinir-senha?token=abc123def456`, } return render(, { pretty: true }) }, }, ] async function main() { const targetEmail = process.argv[2] ?? "renan.pac@paulicon.com.br" const smtp = getSmtpConfig() if (!smtp) { console.error("SMTP não configurado. Defina as variáveis SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, SMTP_FROM_EMAIL") process.exit(1) } console.log("=".repeat(60)) console.log("Teste de E-mails - Sistema de Chamados Raven") console.log("=".repeat(60)) console.log(`\nDestinatario: ${targetEmail}`) console.log(`SMTP: ${smtp.host}:${smtp.port}`) console.log(`De: ${smtp.from}`) console.log(`\nEnviando ${scenarios.length} e-mails de teste...\n`) let success = 0 let failed = 0 for (const scenario of scenarios) { try { process.stdout.write(` ${scenario.name}... `) const html = await scenario.render() await sendSmtpMail(smtp, targetEmail, scenario.subject, html) console.log("OK") success++ // Pequeno delay entre envios para evitar rate limit await new Promise((resolve) => setTimeout(resolve, 500)) } catch (error) { console.log(`ERRO: ${error instanceof Error ? error.message : error}`) failed++ } } console.log("\n" + "=".repeat(60)) console.log(`Resultado: ${success} enviados, ${failed} falharam`) console.log("=".repeat(60)) if (failed > 0) { process.exit(1) } } main().catch((error) => { console.error("Erro fatal:", error) process.exit(1) })