package clients import ( "bytes" "fmt" "gitea.pena/PenaSide/notifier/internal/initialize" "github.com/gofiber/fiber/v2" "go.uber.org/zap" "html/template" "mime/multipart" ) type MailClient struct { smtpApiUrl string smtpSender string apiKey string fiberClient *fiber.Client logger *zap.Logger } func NewMailClient(deps initialize.MailClientCfg) *MailClient { if deps.FiberClient == nil { deps.FiberClient = fiber.AcquireClient() } return &MailClient{ smtpApiUrl: deps.ApiURL, smtpSender: deps.Sender, apiKey: deps.ApiKey, fiberClient: deps.FiberClient, logger: deps.Logger, } } type SenderDeps struct { Subject string Email string Tmpl string } func (m *MailClient) MailSender(data SenderDeps) error { tmpl, err := template.New("email").Parse(data.Tmpl) if err != nil { m.logger.Error("Error parsing HTML template:", zap.Error(err)) return err } var buf bytes.Buffer if err = tmpl.Execute(&buf, nil); err != nil { m.logger.Error("Error executing template:", zap.Error(err)) return err } htmlBody := buf.String() form := new(bytes.Buffer) writer := multipart.NewWriter(form) fields := map[string]string{ "from": m.smtpSender, "to": data.Email, "subject": data.Subject, "html": htmlBody, } for key, value := range fields { if err = writer.WriteField(key, value); err != nil { return err } } if err = writer.Close(); err != nil { return err } req := m.fiberClient.Post(m.smtpApiUrl).Body(form.Bytes()).ContentType(writer.FormDataContentType()) if m.apiKey != "" { req.Set("Authorization", m.apiKey) } statusCode, body, errs := req.Bytes() if errs != nil { m.logger.Error("Error sending request:", zap.Error(errs[0])) return errs[0] } if statusCode != fiber.StatusOK { err = fmt.Errorf("the SMTP service returned an error: %s Response body: %s", statusCode, body) m.logger.Error("Error sending email:", zap.Error(err)) return err } return nil }