From c144bb2b97f5979b0d6071cf9de948c04bba5b52 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Sat, 7 Mar 2026 05:53:46 +0000 Subject: [PATCH] fix: enhance email notification formatting with HTML for improved readability --- backend/internal/services/notification_service.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/backend/internal/services/notification_service.go b/backend/internal/services/notification_service.go index 0f8aba5e..9032f0ed 100644 --- a/backend/internal/services/notification_service.go +++ b/backend/internal/services/notification_service.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "fmt" + "html" "net" "net/http" neturl "net/url" @@ -283,24 +284,24 @@ func (s *NotificationService) dispatchEmail(ctx context.Context, p models.Notifi safeTitle := sanitizeForEmail(title) safeMessage := sanitizeForEmail(message) subject := fmt.Sprintf("[Charon Alert] %s", safeTitle) - // Build a plain-text body; MailService will convert this to safe HTML and - // perform additional sanitization before sending. var bodyBuilder strings.Builder if safeTitle != "" { - bodyBuilder.WriteString(safeTitle) + bodyBuilder.WriteString("") + bodyBuilder.WriteString(html.EscapeString(safeTitle)) + bodyBuilder.WriteString("") } if safeMessage != "" { if bodyBuilder.Len() > 0 { - bodyBuilder.WriteString("\n\n") + bodyBuilder.WriteString("
") } - bodyBuilder.WriteString(safeMessage) + bodyBuilder.WriteString(html.EscapeString(safeMessage)) } - plainBody := bodyBuilder.String() + htmlBody := bodyBuilder.String() timeoutCtx, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() - if err := s.mailService.SendEmail(timeoutCtx, recipients, subject, plainBody); err != nil { + if err := s.mailService.SendEmail(timeoutCtx, recipients, subject, htmlBody); err != nil { logger.Log().WithError(err).WithField("provider", util.SanitizeForLog(p.Name)).Error("Failed to send email notification") } }