package mailer import ( domain "RenewCMS/internal/domain/mail" "RenewCMS/internal/infrastructure/config" "bytes" "embed" "html/template" "log" "gopkg.in/gomail.v2" ) type MailRepository struct { smtp config.SmtpSettings } //go:embed templates/* var mailTemplateFiles embed.FS func NewMailRepository(smtp config.SmtpSettings) *MailRepository { return &MailRepository{smtp: smtp} } func (m MailRepository) Send(receiverAddress string, templateName string, data any) error { from := m.smtp.Email password := m.smtp.Password smtpHost := m.smtp.Host smtpPort := m.smtp.Port d := gomail.NewDialer(smtpHost, smtpPort, from, password) tmpl, err := template.ParseFS(mailTemplateFiles, "templates/"+templateName+".html") if err != nil { log.Println("error when template.ParseFS:", err) return err } var body bytes.Buffer err = tmpl.Execute(&body, data) if err != nil { log.Println("error when tmpl.Execute:", err) return err } msg := gomail.NewMessage() msg.SetHeaders(map[string][]string{ "From": {"RenewCMS <" + from + ">"}, "To": {receiverAddress}, "MIME-version": {"1.0"}, "Content-Type": {"text/html"}, "charset": {"UTF-8"}, "Subject": {"RenewCMS | Action required"}, }) msg.SetBody("text/html", body.String()) if err := d.DialAndSend(msg); err != nil { log.Println("error when sending email:", err) return err } return nil } var _ domain.Repository = &MailRepository{}