|
|
|
@ -6,17 +6,14 @@ import ( |
|
|
|
"context" |
|
|
|
"context" |
|
|
|
"log" |
|
|
|
"log" |
|
|
|
"github.com/redis/go-redis/v9" |
|
|
|
"github.com/redis/go-redis/v9" |
|
|
|
"github.com/gofiber/template/html/v2" |
|
|
|
"github.com/yuin/goldmark" |
|
|
|
"MY/webapp/config" |
|
|
|
"MY/webapp/config" |
|
|
|
|
|
|
|
"path/filepath" |
|
|
|
|
|
|
|
"text/template" |
|
|
|
|
|
|
|
"os" |
|
|
|
"strings" |
|
|
|
"strings" |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
var HTMLTemplates *html.Engine |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func init() { |
|
|
|
|
|
|
|
HTMLTemplates = html.New("./emails", ".html") |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func NewSender(ctx context.Context) (Sender){ |
|
|
|
func NewSender(ctx context.Context) (Sender){ |
|
|
|
client := redis.NewClient(&redis.Options{ |
|
|
|
client := redis.NewClient(&redis.Options{ |
|
|
|
Addr: config.Settings.Redis.HostPort, |
|
|
|
Addr: config.Settings.Redis.HostPort, |
|
|
|
@ -55,6 +52,33 @@ func (sender *Sender) Close() { |
|
|
|
sender.redis_client.Close() |
|
|
|
sender.redis_client.Close() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func (router *Router) Render(tmpl_path string, data any) (string, string, error) { |
|
|
|
|
|
|
|
tmpl_path = filepath.Join(config.Settings.Email.Templates, tmpl_path) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// load the markdown file
|
|
|
|
|
|
|
|
md_file, err := os.ReadFile(tmpl_path) |
|
|
|
|
|
|
|
if err != nil { return "", "", err } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// template it
|
|
|
|
|
|
|
|
tmpl, err := template.New(tmpl_path).Parse(string(md_file)) |
|
|
|
|
|
|
|
if err != nil { return "", "", err } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
out := new(strings.Builder) |
|
|
|
|
|
|
|
err = tmpl.Execute(out, data) |
|
|
|
|
|
|
|
if err != nil { return "", "", err } |
|
|
|
|
|
|
|
text_out := out.String() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// convert to html
|
|
|
|
|
|
|
|
out.Reset() |
|
|
|
|
|
|
|
err = goldmark.Convert([]byte(text_out), out) |
|
|
|
|
|
|
|
if err != nil { return "", "", err } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
html_out := out.String() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// return the template .md as plain text and .html as html
|
|
|
|
|
|
|
|
return string(text_out), string(html_out), nil |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (router *Router) DeliverEmail(msg EmailMessage) error { |
|
|
|
func (router *Router) DeliverEmail(msg EmailMessage) error { |
|
|
|
email_msg := mail.NewMsg() |
|
|
|
email_msg := mail.NewMsg() |
|
|
|
err := email_msg.From(msg.From) |
|
|
|
err := email_msg.From(msg.From) |
|
|
|
@ -65,10 +89,6 @@ func (router *Router) DeliverEmail(msg EmailMessage) error { |
|
|
|
|
|
|
|
|
|
|
|
email_msg.Subject(msg.Subject) |
|
|
|
email_msg.Subject(msg.Subject) |
|
|
|
|
|
|
|
|
|
|
|
out := new(strings.Builder) |
|
|
|
|
|
|
|
err = HTMLTemplates.Render(out, msg.HTMLTemplate, msg.Data) |
|
|
|
|
|
|
|
email_msg.SetBodyString(mail.TypeTextHTML, out.String()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if config.Settings.Email.XMailer != "" { |
|
|
|
if config.Settings.Email.XMailer != "" { |
|
|
|
email_msg.SetGenHeader(mail.HeaderXMailer, config.Settings.Email.XMailer) |
|
|
|
email_msg.SetGenHeader(mail.HeaderXMailer, config.Settings.Email.XMailer) |
|
|
|
} |
|
|
|
} |
|
|
|
@ -77,8 +97,12 @@ func (router *Router) DeliverEmail(msg EmailMessage) error { |
|
|
|
email_msg.SetGenHeader(mail.HeaderUserAgent, config.Settings.Email.UserAgent) |
|
|
|
email_msg.SetGenHeader(mail.HeaderUserAgent, config.Settings.Email.UserAgent) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
text, html, err := router.Render(msg.Template, nil) |
|
|
|
if err != nil { return err } |
|
|
|
if err != nil { return err } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
email_msg.SetBodyString(mail.TypeTextHTML, html) |
|
|
|
|
|
|
|
email_msg.AddAlternativeString(mail.TypeTextPlain, text) |
|
|
|
|
|
|
|
|
|
|
|
err = router.smtp_client.DialAndSendWithContext(router.ctx, email_msg) |
|
|
|
err = router.smtp_client.DialAndSendWithContext(router.ctx, email_msg) |
|
|
|
if err != nil { return err } |
|
|
|
if err != nil { return err } |
|
|
|
|
|
|
|
|
|
|
|
|