package services import ( "fmt" "log" "strings" "sync" "github.com/sujit-baniya/fiber-boilerplate/app" "github.com/sujit-baniya/fiber-boilerplate/pkg/models" ) // soporteSendMail envía un correo usando la configuración SMTP del webhook de soporte. // Si no hay SMTP configurado, usa app.Http.Mail como fallback. func soporteSendMail(to, subject, htmlBody string) error { // Sin base no hay configuración que leer: consultarla igual revienta con un // nil, y como el envío corre en su propia goroutine se lleva puesto todo el // proceso. Es lo que hacía que la suite de este paquete no se pudiera // correr entera. if app.Http.Database.DB == nil { return fmt.Errorf("no hay base de datos para leer la configuración de correo") } cfg, err := models.GetSoporteWebhookActivo() if err != nil || cfg == nil || cfg.SmtpHost == "" { return app.Http.Mail.Send(to, subject, htmlBody) } from := cfg.SmtpFromAddr if from == "" { from = cfg.EmailDestino } if from == "" { return app.Http.Mail.Send(to, subject, htmlBody) } fromName := cfg.SmtpFromName if fromName == "" { fromName = "Soporte" } port := cfg.SmtpPort if port == 0 { port = 587 } if err := EnviarPorSMTP(DatosSMTP{ Host: cfg.SmtpHost, Puerto: port, Encriptado: cfg.SmtpEncryption, Usuario: cfg.SmtpUsername, Password: cfg.SmtpPassword, Desde: from, DesdeNombre: fromName, }, to, subject, htmlBody); err != nil { return fmt.Errorf("SMTP de soporte (%s:%d): %w", cfg.SmtpHost, port, err) } return nil } // ProbarEnvioSoporte manda un correo de prueba por el mismo camino que usa el // acuse automático, y devuelve el error tal cual. Es la única forma de saber // por qué no llega: el acuse real se manda en segundo plano. func ProbarEnvioSoporte(destino string) error { if strings.TrimSpace(destino) == "" { return fmt.Errorf("indicá a qué dirección mandar la prueba") } cuerpo := `
Esto es una prueba del envío de soporte.
Si te llegó, el acuse automático de los tickets también va a salir por acá.
` return soporteSendMail(destino, "Prueba de envío de soporte", cuerpo) } // SendSoporteAutoRespuesta envía acuse de recibo automático al crear un ticket por email func SendSoporteAutoRespuesta(ticket *models.ProyectoTicket) { if ticket == nil || ticket.EmailFrom == "" { return } subject := fmt.Sprintf("[Ticket #%d] Recibimos tu solicitud: %s", ticket.ID, ticket.Titulo) mensaje := "Hemos recibido tu solicitud y te responderemos a la brevedad." if app.Http.Database.DB != nil { if cfg, err := models.GetSoporteWebhookActivo(); err == nil && cfg.MensajeAuto != "" { mensaje = cfg.MensajeAuto } } htmlBody := fmt.Sprintf(`Soporte U-site
Hola %s,
%s
Ticket: #%d
Asunto: %s
Mensaje: %s
Este es un mensaje automático. No respondas a este correo.