2024-04-17 20:22:30 +02:00

100 lines
2.2 KiB
Go

package infra
import (
"bytes"
"fmt"
"io"
"os"
"path/filepath"
"voltaserve/config"
"github.com/gofiber/fiber/v2/log"
"gopkg.in/gomail.v2"
"sigs.k8s.io/yaml"
"text/template"
)
type MessageParams struct {
Subject string
}
type MailTemplate struct {
dialer *gomail.Dialer
config config.SMTPConfig
}
func NewMailTemplate() *MailTemplate {
mt := new(MailTemplate)
mt.config = config.GetConfig().SMTP
mt.dialer = gomail.NewDialer(mt.config.Host, mt.config.Port, mt.config.Username, mt.config.Password)
return mt
}
func (mt *MailTemplate) Send(templateName string, address string, variables map[string]string) error {
html, err := mt.GetText(filepath.FromSlash("templates/"+templateName+"/template.html"), variables)
if err != nil {
return err
}
text, err := mt.GetText(filepath.FromSlash("templates/"+templateName+"/template.txt"), variables)
if err != nil {
return err
}
params, err := mt.GetMessageParams(templateName)
if err != nil {
return err
}
m := gomail.NewMessage()
m.SetHeader("From", fmt.Sprintf(`"%s" <%s>`, mt.config.SenderName, mt.config.SenderAddress))
m.SetHeader("To", address)
m.SetHeader("Subject", params.Subject)
m.SetBody("text/plain ", text)
m.AddAlternative("text/html", html)
if err := mt.dialer.DialAndSend(m); err != nil {
return err
}
return nil
}
func (mt *MailTemplate) GetText(path string, variables map[string]string) (string, error) {
f, err := os.Open(path)
if err != nil {
return "", err
}
defer func(f *os.File) {
if err := f.Close(); err != nil {
log.Error(err)
}
}(f)
b, _ := io.ReadAll(f)
html := string(b)
tmpl, err := template.New("").Parse(html)
if err != nil {
return "", nil
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, variables)
if err != nil {
return "", nil
}
return buf.String(), nil
}
func (mt *MailTemplate) GetMessageParams(templateName string) (*MessageParams, error) {
f, err := os.Open(filepath.FromSlash("templates/" + templateName + "/params.yml"))
if err != nil {
return nil, err
}
defer func(f *os.File) {
if err := f.Close(); err != nil {
log.Error(err)
}
}(f)
b, _ := io.ReadAll(f)
res := &MessageParams{}
if err := yaml.Unmarshal(b, res); err != nil {
return nil, err
}
return res, nil
}