/
provider.go
128 lines (101 loc) · 2.45 KB
/
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
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
120
121
122
123
124
125
126
127
128
package emailutils
import (
"fmt"
)
type ProviderEntity string
type ProviderConfig map[string]interface{}
const (
SMTPProvider ProviderEntity = "SMTP"
// TODO: implement breo provider. // BrevoProvider ProviderEntity = "BREVO"
MailgunProvider ProviderEntity = "MAILGUN"
SendgridProvider ProviderEntity = "SENDGRID"
)
// Errors
var (
ErrProviderNotSupported = fmt.Errorf("DNS Provider not supported")
ErrNoFrom = fmt.Errorf("from not provided")
ErrNoRecipients = fmt.Errorf("no recipients provided")
ErrNoSubject = fmt.Errorf("no subject provided")
ErrNoBody = fmt.Errorf("no body provided")
)
type Person struct {
Name string
Email string
}
func NewPerson(name, email string) *Person {
return &Person{Name: name, Email: email}
}
func (p *Person) String() string {
return fmt.Sprintf("%s <%s>", p.Name, p.Email)
}
func (p *Person) Validate() error {
if p.Email == "" {
return fmt.Errorf("no email provided")
}
return nil
}
type Attachment struct {
Name string
ContentType string
Data []byte
}
func NewAttachment(name, contentType string, data []byte) *Attachment {
return &Attachment{Name: name, ContentType: contentType, Data: data}
}
func (a *Attachment) Validate() error {
if a.Name == "" {
return fmt.Errorf("no name provided")
}
if len(a.Data) == 0 {
return fmt.Errorf("no data provided")
}
return nil
}
// Define Email struct
type Email struct {
Subject string
From *Person
To []*Person
Cc []*Person
Bcc []*Person
Body string
Attachments []*Attachment
}
func (e *Email) Validate() error {
if e.From.Validate() != nil {
return ErrNoFrom
}
for _, to := range e.To {
if to.Validate() != nil {
return ErrNoRecipients
}
}
if e.Subject == "" {
return ErrNoSubject
}
if e.Body == "" {
return ErrNoBody
}
return nil
}
// Define the Provider interface
type Provider interface {
Send(e *Email) error
SupportAttachments() bool
}
// GetProvider returns an email provider
func GetProvider(entity ProviderEntity, config ProviderConfig) (Provider, error) {
var err error = nil
var emailProvider Provider = nil
switch entity {
case SMTPProvider:
emailProvider, err = newSMTPProvider(config)
case MailgunProvider:
emailProvider, err = newMailgunProvider(config)
case SendgridProvider:
emailProvider, err = newSendgridProvider(config)
default:
err = ErrProviderNotSupported
}
return emailProvider, err
}