/
mailer.go
119 lines (99 loc) · 2.25 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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package mailer
import (
"fmt"
"net/mail"
"github.com/ecletus/render"
"github.com/moisespsena-go/assetfs"
"github.com/ecletus/core"
)
// Mailer mailer struct
type Mailer struct {
*Config
}
// Config mailer config
type Config struct {
DefaultEmailTemplate *Email
AssetFS assetfs.Interface
Sender SenderInterface
From *mail.Address
*render.Render
}
// New initialize mailer
func New(config *Config) *Mailer {
if config == nil {
config = &Config{}
}
if config.Render == nil {
config.Render = render.New(nil)
config.Render.SetAssetFS(config.AssetFS)
}
return &Mailer{config}
}
// Send send email
func (mailer Mailer) Send(site *core.Site, email *Email, templates ...Template) (err error) {
copy := *email
if copy.From == nil {
copy.From = mailer.From
}
var formatAddr = func(addr ...mail.Address) (result []mail.Address) {
result = make([]mail.Address, len(addr), len(addr))
for i, addr := range addr {
if addr.Name != "" {
if addr.Name, err = site.TextRender(addr.Name); err != nil {
return
}
}
if addr.Address, err = site.TextRender(addr.Address); err != nil {
return
}
result[i] = addr
}
return
}
*copy.From = formatAddr(*copy.From)[0]
if err != nil {
return
}
copy.TO = formatAddr(copy.TO...)
if err != nil {
return
}
if mailer.DefaultEmailTemplate != nil {
copy = *mailer.DefaultEmailTemplate.Merge(©)
}
if len(templates) == 0 {
return mailer.Sender.Send(©)
}
var langs = copy.Lang
for _, template := range templates {
Email, err := mailer.Render(template, langs...)
if err == nil {
if err := mailer.Sender.Send(Email.Merge(©)); err != nil {
return err
}
return nil
}
return err
}
return nil
}
// WithSender set sender now
func (mailer Mailer) WithSender(Sender SenderInterface) Mailer {
if Sender != nil {
mailer.Sender = Sender
}
return mailer
}
type SiteMailer struct {
Site *core.Site
}
func (this SiteMailer) Mailer() *Mailer {
return MustGet(this.Site.Data)
}
func (this SiteMailer) Send(email *Email, templates ...Template) (err error) {
mailer := this.Mailer()
if mailer == nil {
return fmt.Errorf("no mailer for site %q", this.Site.Name())
}
return mailer.Send(this.Site, email, templates...)
}