package smtpclient import ( "bytes" "embed" "errors" "fmt" "html/template" "strings" ) type SMTPClient struct{} //go:embed template/* var templates embed.FS func (s SMTPClient) SendMail(templateName string, to string, data any) error { if to == "error@error.error" { return errors.New("error mail send") } return nil } func NewDummySMTPClient() SMTPClient { s := SMTPClient{} return s } func (s SMTPClient) renderTemplates(templateName string, data any) (string, string, string, error) { subject, err := s.renderFile(fmt.Sprintf("%v.subject", templateName), data) if err != nil { return "", "", "", err } txt, err := s.renderFile(fmt.Sprintf("%v.txt", templateName), data) if err != nil { return "", "", "", err } html, err := s.renderFile(fmt.Sprintf("%v.html", templateName), data) if err != nil { return "", "", "", err } return subject, txt, html, nil } func (s SMTPClient) renderFile(filename string, data any) (string, error) { tmpl, err := template.ParseFS(templates, "template/"+filename) if err != nil { return "", err } var buf bytes.Buffer err = tmpl.Execute(&buf, data) if err != nil { return "", err } renderedString := buf.String() return strings.Trim(renderedString, "\n"), nil }