fix(soporte): aviso repetido en Telegram y el acuse al cliente que no salía

Telegram: los avisos se mandaban a todas las configuraciones activas sin mirar
a dónde apuntan. Con el mismo chat cargado en dos filas, cada aviso llegaba dos
veces. Ahora se manda una vez por destino (bot + chat); los chats distintos
siguen recibiendo todos.

Correo al remitente: el camino STARTTLS abría una conexión, hacía StartTLS,
autenticaba… y la descartaba para llamar a smtp.SendMail, que abre otra. La
primera quedaba colgada y el envío real salía por una conexión distinta, que
podía no estar autenticada. Reescrito: una sola conexión, asegurada según la
configuración, y cierre con QUIT.

Y como el acuse se manda en segundo plano, su error moría en el log. Ahora hay
un botón "Enviar correo de prueba" que usa exactamente el mismo camino y
devuelve el error del servidor en pantalla, y el último fallo del acuse real
aparece en el resultado de "Revisar buzón ahora".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-17 20:13:11 -05:00
co-authored by Claude Opus 5
parent 17ed57cb56
commit 5afbd9e375
5 changed files with 168 additions and 53 deletions
+19
View File
@@ -343,6 +343,9 @@ func RevisarBuzonAhora(c *fiber.Ctx) error {
if descartes := services.UltimosCorreosDescartados(); len(descartes) > 0 {
msg += fmt.Sprintf(" El filtro descartó %d: %s", len(descartes), strings.Join(descartes, " | "))
}
if e := services.UltimoErrorAcuse(); e != "" {
msg += " ⚠️ " + e
}
return c.JSON(fiber.Map{"ok": true, "message": msg})
}
@@ -380,3 +383,19 @@ func GetAgentesParaBorrador(c *fiber.Ctx) error {
}
return c.JSON(salida)
}
// ProbarEnvioSoporte manda un correo de prueba por el mismo camino que el acuse
// automático de los tickets.
// POST /app/soporte/webhook/probar-envio
func ProbarEnvioSoporte(c *fiber.Ctx) error {
var b struct {
Email string `json:"email"`
}
if err := c.BodyParser(&b); err != nil {
return c.Status(400).JSON(fiber.Map{"error": "body inválido"})
}
if err := services.ProbarEnvioSoporte(b.Email); err != nil {
return c.Status(400).JSON(fiber.Map{"error": err.Error()})
}
return c.JSON(fiber.Map{"ok": true, "message": "Correo de prueba enviado a " + b.Email})
}