This repository has been archived by the owner on Feb 17, 2023. It is now read-only.
/
mailer.go
78 lines (67 loc) · 1.4 KB
/
mailer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package mailer
import (
"bytes"
"fmt"
"path"
"strings"
"net/smtp"
"pault.ag/go/config"
"text/template"
)
type MailerRC struct {
Sender string `flag:"mailer-sender" description:"SMTP Sender"`
Password string `flag:"mailer-password" description:"SMTP Password"`
Host string `flag:"mailer-server" description:"SMTP Server"`
Port int `flag:"mailer-port" description:"SMTP Port"`
}
type Mailer struct {
Config MailerRC
Root string
}
type MailerData struct {
From string
To string
Data interface{}
}
func (m *Mailer) Mail(to []string, mailTemplate string, data interface{}) error {
if m.Config.Host == "" {
/* We're basically disabled. */
return nil
}
auth := smtp.PlainAuth(
"",
m.Config.Sender,
m.Config.Password,
m.Config.Host,
)
byteBuffer := bytes.Buffer{}
t, err := template.ParseFiles(path.Join(m.Root, mailTemplate))
if err != nil {
return err
}
if err := t.Execute(&byteBuffer, MailerData{
From: m.Config.Sender,
To: strings.Join(to, ", "),
Data: data,
}); err != nil {
return err
}
err = smtp.SendMail(
fmt.Sprintf("%s:%d", m.Config.Host, m.Config.Port),
auth,
m.Config.Sender,
to,
byteBuffer.Bytes(),
)
return err
}
func NewMailer(root string) (*Mailer, error) {
mailerRC := MailerRC{}
if err := config.Load("mailer", &mailerRC); err != nil {
return nil, err
}
return &Mailer{
Config: mailerRC,
Root: root,
}, nil
}