'use node'; import { action } from '../_generated/server'; import { v } from 'convex/values'; // Importar nodemailer de forma estática para evitar problemas com caminhos no Windows import nodemailer from 'nodemailer'; export const testarConexao = action({ args: { servidor: v.string(), porta: v.number(), usuario: v.string(), senha: v.string(), usarSSL: v.boolean(), usarTLS: v.boolean() }, returns: v.union( v.object({ sucesso: v.literal(true) }), v.object({ sucesso: v.literal(false), erro: v.string() }) ), handler: async (ctx, args) => { try { // Validações básicas if (!args.servidor || args.servidor.trim() === '') { return { sucesso: false as const, erro: 'Servidor SMTP não pode estar vazio' }; } if (args.porta < 1 || args.porta > 65535) { return { sucesso: false as const, erro: 'Porta inválida' }; } const transporter = nodemailer.createTransport({ host: args.servidor, port: args.porta, secure: args.usarSSL, auth: { user: args.usuario, pass: args.senha }, tls: { rejectUnauthorized: false }, connectionTimeout: 10000, // 10 segundos greetingTimeout: 10000, socketTimeout: 10000 }); // Verificar conexão await transporter.verify(); return { sucesso: true as const }; } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); return { sucesso: false as const, erro: errorMessage }; } } });