-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmessagebuilder.go
More file actions
115 lines (99 loc) · 3.14 KB
/
messagebuilder.go
File metadata and controls
115 lines (99 loc) · 3.14 KB
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
package sendmail
import (
"errors"
"strings"
)
// Email holds email name and address info
type Email struct {
Name string `json:"name,omitempty"`
Address string `json:"email,omitempty"`
}
type Attachment struct {
ContentType string `json:"type,omitempty"`
Filename string `json:"filename,omitempty"`
Base64Content string `json:"content,omitempty"`
Disposition string `json:"disposition,omitempty"`
}
type Message struct {
FromEmail *Email `json:"from,omitempty"`
Recipients []*Email `json:"to,omitempty"`
Subject string `json:"subject,omitempty"`
PlainTextContent string `json:"text,omitempty"`
HtmlContent string `json:"html,omitempty"`
Attachments []*Attachment `json:"attachments,omitempty"`
}
var ErrMissingRecipients = errors.New("sendmail: missing recipient(s) address")
var ErrMissingFrom = errors.New("sendmail: missing 'from' email address")
var ErrMissingSubject = errors.New("sendmail: missing subject")
func (m *Message) Validate() error {
if m.FromEmail == nil {
return ErrMissingFrom
}
if len(m.Recipients) == 0 {
return ErrMissingRecipients
}
if m.Subject == "" {
return ErrMissingSubject
}
return nil
}
type MessageBuilder interface {
FromEmail(name, address string) MessageBuilder
AddRecipient(name, address string) MessageBuilder
Subject(subject string) MessageBuilder
PlainTextContent(plainTextContent string) MessageBuilder
HtmlContent(htmlContent string) MessageBuilder
AddAttachment(contentType, filename, base64Content string, disposition_optional ...string) MessageBuilder
Build() (*Message, error)
}
type messageBuilder struct {
emailMessage *Message
}
func NewEmailMessage() MessageBuilder {
return &messageBuilder{emailMessage: &Message{}}
}
func (m *messageBuilder) FromEmail(name, address string) MessageBuilder {
if strings.TrimSpace(address) == "" {
return m
}
m.emailMessage.FromEmail = &Email{Name: name, Address: address}
return m
}
func (m *messageBuilder) AddRecipient(name, address string) MessageBuilder {
if strings.TrimSpace(address) == "" {
return m
}
m.emailMessage.Recipients = append(m.emailMessage.Recipients, &Email{Name: name, Address: address})
return m
}
func (m *messageBuilder) Subject(subject string) MessageBuilder {
m.emailMessage.Subject = subject
return m
}
func (m *messageBuilder) PlainTextContent(content string) MessageBuilder {
m.emailMessage.PlainTextContent = content
return m
}
func (m *messageBuilder) HtmlContent(content string) MessageBuilder {
m.emailMessage.HtmlContent = content
return m
}
func (m *messageBuilder) AddAttachment(contentType, filename, base64Content string, disposition_optional ...string) MessageBuilder {
disposition := "attachment"
if len(disposition_optional) > 0 {
disposition = disposition_optional[0]
}
m.emailMessage.Attachments = append(m.emailMessage.Attachments, &Attachment{
ContentType: contentType,
Filename: filename,
Base64Content: base64Content,
Disposition: disposition,
})
return m
}
func (m *messageBuilder) Build() (*Message, error) {
if err := m.emailMessage.Validate(); err != nil {
return nil, err
}
return m.emailMessage, nil
}