From 793b1883a966509808acf06957d342dd36ab4bf1 Mon Sep 17 00:00:00 2001 From: Matthew Knight Date: Wed, 18 Feb 2026 09:24:42 -0800 Subject: [PATCH] Fixes #7 --- internal/email/email.go | 18 ++++++++++++++---- internal/handlers/public/webhook.go | 4 ++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/internal/email/email.go b/internal/email/email.go index 048c58d..cc1dfb4 100644 --- a/internal/email/email.go +++ b/internal/email/email.go @@ -65,17 +65,22 @@ func (c *Client) SendPasswordResetEmail(to, name, token string) error { return err } -func (c *Client) SendTicketClosedNotification(to, name, ticketTitle, ticketID string) error { +func (c *Client) SendTicketClosedNotification(to, name, ticketTitle, ticketID, fromName string) error { if c.server == nil { return fmt.Errorf("email client not configured") } + from := c.fromEmail + if fromName != "" { + from = fmt.Sprintf("\"%s\" <%s>", fromName, c.fromEmail) + } + ticketURL := fmt.Sprintf("%s/tickets/%s", c.baseURL, ticketID) htmlBody := renderTicketClosedEmail(name, ticketTitle, ticketURL) textBody := fmt.Sprintf("Hi %s,\n\nYour ticket \"%s\" has been resolved.\n\nView it at: %s", name, ticketTitle, ticketURL) _, err := c.server.SendEmail(context.Background(), postmark.Email{ - From: c.fromEmail, + From: from, To: to, Subject: fmt.Sprintf("Your ticket \"%s\" has been resolved", ticketTitle), HTMLBody: htmlBody, @@ -105,17 +110,22 @@ func (c *Client) SendAccountApprovedEmail(to, name string) error { return err } -func (c *Client) SendTicketReplyNotification(to, name, ticketTitle, ticketID string) error { +func (c *Client) SendTicketReplyNotification(to, name, ticketTitle, ticketID, fromName string) error { if c.server == nil { return fmt.Errorf("email client not configured") } + from := c.fromEmail + if fromName != "" { + from = fmt.Sprintf("\"%s\" <%s>", fromName, c.fromEmail) + } + ticketURL := fmt.Sprintf("%s/tickets/%s", c.baseURL, ticketID) htmlBody := renderTicketReplyEmail(name, ticketTitle, ticketURL) textBody := fmt.Sprintf("Hi %s,\n\nThere is a new reply on your ticket \"%s\".\n\nView it at: %s", name, ticketTitle, ticketURL) _, err := c.server.SendEmail(context.Background(), postmark.Email{ - From: c.fromEmail, + From: from, To: to, Subject: fmt.Sprintf("New reply on your ticket \"%s\"", ticketTitle), HTMLBody: htmlBody, diff --git a/internal/handlers/public/webhook.go b/internal/handlers/public/webhook.go index 296e639..e6a4415 100644 --- a/internal/handlers/public/webhook.go +++ b/internal/handlers/public/webhook.go @@ -83,7 +83,7 @@ func (h *WebhookHandler) handleIssueEvent(c *gin.Context, repo *models.Repo, pay if err := h.deps.DB.First(&user, "id = ?", ticket.UserID).Error; err == nil { go func() { if err := h.deps.EmailClient.SendTicketClosedNotification( - user.Email, user.Name, payload.Issue.Title, ticket.ID.String(), + user.Email, user.Name, payload.Issue.Title, ticket.ID.String(), repo.Name+" Support", ); err != nil { log.Error().Err(err).Msg("webhook: send notification error") } @@ -117,7 +117,7 @@ func (h *WebhookHandler) handleCommentEvent(c *gin.Context, repo *models.Repo, p if err := h.deps.DB.First(&user, "id = ?", ticket.UserID).Error; err == nil { go func() { if err := h.deps.EmailClient.SendTicketReplyNotification( - user.Email, user.Name, payload.Issue.Title, ticket.ID.String(), + user.Email, user.Name, payload.Issue.Title, ticket.ID.String(), repo.Name+" Support", ); err != nil { log.Error().Err(err).Msg("webhook: send reply notification error") }