-
Notifications
You must be signed in to change notification settings - Fork 3
/
email.go
121 lines (105 loc) · 2.66 KB
/
email.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
package emailing
import (
"context"
"gopkg.in/gomail.v2"
"github.com/gidyon/services/pkg/api/messaging/emailing"
"github.com/gidyon/micro/v2/pkg/middleware/grpc/auth"
"github.com/gidyon/micro/v2/utils/errs"
"github.com/golang/protobuf/ptypes/empty"
"google.golang.org/grpc/grpclog"
)
type dialer interface {
DialAndSend(...*gomail.Message) error
}
type emailingAPIServer struct {
emailing.UnimplementedEmailingServer
sender func(*emailing.SendEmailRequest)
dialer dialer
*Options
}
// Options contains the parameters passed while calling NewEmailingAPIServer
type Options struct {
Logger grpclog.LoggerV2
AuthAPI auth.API
SMTPHost string
SMTPPort int
SMTPUsername string
SMTPPassword string
}
// NewEmailingAPIServer is singleton for creating email server APIs
func NewEmailingAPIServer(ctx context.Context, opt *Options) (emailing.EmailingServer, error) {
// Validation
var err error
switch {
case ctx == nil:
err = errs.NilObject("context")
case opt == nil:
err = errs.NilObject("options")
case opt.Logger == nil:
err = errs.NilObject("logger")
case opt.AuthAPI == nil:
err = errs.NilObject("auth api")
case opt.SMTPHost == "":
err = errs.MissingField("smtp host")
case opt.SMTPPort == 0:
err = errs.MissingField("smtp port")
case opt.SMTPUsername == "":
err = errs.MissingField("smtp username")
case opt.SMTPPassword == "":
err = errs.MissingField("smtp password")
}
if err != nil {
return nil, err
}
// SMTP dialer
dialer := &gomail.Dialer{
Host: opt.SMTPHost,
Port: opt.SMTPPort,
Username: opt.SMTPUsername,
Password: opt.SMTPPassword,
}
// API
emailingAPI := &emailingAPIServer{
Options: opt,
dialer: dialer,
}
emailingAPI.sender = emailingAPI.sendEmail
return emailingAPI, nil
}
func (api *emailingAPIServer) SendEmail(
ctx context.Context, sendReq *emailing.SendEmailRequest,
) (*empty.Empty, error) {
// Validate email
switch {
case sendReq == nil:
return nil, errs.NilObject("send request")
case sendReq.Email == nil:
return nil, errs.NilObject("email")
default:
err := validateEmail(sendReq.Email)
if err != nil {
return nil, err
}
}
// Send email
go api.sender(sendReq)
return &empty.Empty{}, nil
}
func validateEmail(email *emailing.Email) error {
var err error
switch {
case email == nil:
err = errs.NilObject("email")
case len(email.Destinations) == 0:
err = errs.MissingField("destinations")
case email.From == "":
err = errs.MissingField("from")
case email.Subject == "":
err = errs.MissingField("subject")
case email.Body == "":
err = errs.MissingField("body")
case email.BodyContentType == "":
email.BodyContentType = "text/html"
}
return err
}