100 lines
2.2 KiB
Go
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
|
|
}
|