/
smtp_provider.go
93 lines (76 loc) · 1.79 KB
/
smtp_provider.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package emailutils
import (
"io"
"gopkg.in/gomail.v2"
)
type smtpProvider struct {
server string
port int
user string
pass string
skipTls bool
}
func BuildSMTPConfig(server string, port int, user, pass string, skipTls bool) ProviderConfig {
return ProviderConfig{
"server": server,
"port": port,
"user": user,
"pass": pass,
"skipTls": skipTls,
}
}
func newSMTPProvider(config ProviderConfig) (*smtpProvider, error) {
return &smtpProvider{
server: config["server"].(string),
port: config["port"].(int),
user: config["user"].(string),
pass: config["pass"].(string),
skipTls: config["skipTls"].(bool),
}, nil
}
// Send sends an email using gomail
func (s *smtpProvider) Send(e *Email) error {
m := gomail.NewMessage()
// Validations
err := e.Validate()
if err != nil {
return err
}
// Tos
tos := make([]string, len(e.To))
for i, to := range e.To {
tos[i] = m.FormatAddress(to.Email, to.Name)
}
// Ccs
ccs := make([]string, len(e.Cc))
for i, cc := range e.Cc {
ccs[i] = m.FormatAddress(cc.Email, cc.Name)
}
// Bccs
bccs := make([]string, len(e.Bcc))
for i, bcc := range e.Bcc {
bccs[i] = m.FormatAddress(bcc.Email, bcc.Name)
}
m.SetHeaders(map[string][]string{
"Subject": {e.Subject},
"From": {m.FormatAddress(e.From.Email, e.From.Name)},
"To": tos,
"Cc": ccs,
"Bcc": bccs,
})
m.SetBody("text/html", e.Body)
// Attachments
for _, a := range e.Attachments {
m.Attach(a.Name, gomail.SetCopyFunc(func(w io.Writer) error {
_, err := w.Write(a.Data)
return err
}))
}
d := gomail.NewDialer(s.server, s.port, s.user, s.pass)
// d.SSL = true
// d.TLSConfig = &tls.Config{InsecureSkipVerify: s.skipTls}
return d.DialAndSend(m)
}
func (s *smtpProvider) SupportAttachments() bool {
return true
}