diff --git a/main.go b/main.go index 02a8a84..4c2db8a 100755 --- a/main.go +++ b/main.go @@ -92,6 +92,8 @@ func main() { &models.Servidor{}, &models.ConxDb{}, &models.ProvServidor{}, + // SMTP + &models.SmtpConfig{}, // WebSMS (LabsMobile) &models.WebSmsConfig{}, &models.WebSmsLog{}, diff --git a/pkg/services/mail_service.go b/pkg/services/mail_service.go index b165d9e..df66efd 100755 --- a/pkg/services/mail_service.go +++ b/pkg/services/mail_service.go @@ -11,58 +11,42 @@ import ( ) func SendPasswordResetEmail(email string, baseURL string) { - // Generar un identificador único para el correo de restablecimiento resetEmail := fmt.Sprintf("%s-reset-%d", email, time.Now().Unix()) - // Generar la URL de restablecimiento resetLink := GeneratePasswordResetURL(resetEmail, baseURL) - // Preparar el cuerpo HTML del correo utilizando la plantilla htmlBody := app.Http.Mail.PrepareHtml("emails/password-reset", fiber.Map{ "reset_link": resetLink, }) + if htmlBody == "" { + htmlBody = fmt.Sprintf(`

Restablece tu contraseña haciendo clic aquí: %s

`, resetLink, resetLink) + } - // Canal para recibir errores de la goroutine - errChan := make(chan error) - - // Ejecutar la goroutine para enviar el correo de manera asíncrona - go func() { - err := app.Http.Mail.Send(email, "Solicitud de restablecimiento de contraseña - U-site", htmlBody, "") - errChan <- err // Enviar el error (o nil si no hay error) al canal - }() - - // Esperar el resultado de la goroutine - err := <-errChan - if err != nil { - log.Printf("Error enviando el correo de restablecimiento: %s", err) + if err := app.Http.Mail.Send(email, "Solicitud de restablecimiento de contraseña - U-site", htmlBody); err != nil { + log.Printf("[MAIL] Error enviando reset a %s: %v", email, err) } else { - log.Println("Correo de restablecimiento enviado con éxito") + log.Printf("[MAIL] Reset enviado a %s", email) } } func SendConfirmationEmail(email string, baseURL string, nombreUsuario string) { - // Generar el enlace de confirmación + log.Printf("[MAIL] SendConfirmationEmail → to=%s host=%s port=%d from=%s", + email, app.Http.Mail.Host, app.Http.Mail.Port, app.Http.Mail.FromAddress) + confirmLink := GenerateConfirmURL(nombreUsuario, baseURL) - // Preparar el cuerpo HTML del correo utilizando la plantilla + htmlBody := app.Http.Mail.PrepareHtml("emails/confirm", fiber.Map{ "confirm_link": confirmLink, }) + if htmlBody == "" { + log.Printf("[MAIL] PrepareHtml devolvió cuerpo vacío, usando fallback HTML") + htmlBody = fmt.Sprintf(`

Hola %s, confirma tu registro haciendo clic aquí: %s

`, + nombreUsuario, confirmLink, confirmLink) + } + log.Printf("[MAIL] HTML body length: %d bytes", len(htmlBody)) - // Canal para recibir errores de la goroutine - errChan := make(chan error) - - // Ejecutar la goroutine para enviar el correo de manera asíncrona - go func() { - err := app.Http.Mail.Send(email, "✅ ¡Confirma tu registro en la Oficina Virtual de U-site!", htmlBody, "") - errChan <- err // Enviar el error (o nil si no hay error) al canal - }() - - // Esperar el resultado de la goroutine - err := <-errChan - if err != nil { - // Manejar el error si ocurrió - log.Printf("Error enviando el correo de confirmación: %s", err) + if err := app.Http.Mail.Send(email, "✅ ¡Confirma tu registro en la Oficina Virtual de U-site!", htmlBody); err != nil { + log.Printf("[MAIL] Error enviando confirmación a %s: %v", email, err) } else { - // Imprimir en consola si el correo se envió con éxito - log.Println("Correo electrónico de confirmación enviado a:", email) + log.Printf("[MAIL] Confirmación enviada a %s", email) } }