/
e_mailer.go
101 lines (83 loc) · 1.99 KB
/
e_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
package backend_utils
import (
"net/smtp"
"text/template"
"github.com/aloknerurkar/task-runner"
"os"
"fmt"
"bytes"
"time"
tpl "html/template"
)
type EmailConf struct {
Host string
Port int
UserName string
Password string
Auth smtp.Auth
Template *template.Template
}
type MailerDaemonType interface {
SendEmail(to, subject, message string, args... interface{})
}
type MailerDaemon struct {
conf *EmailConf
runner *task_runner.TaskRunner
}
var emailScript = `From: {{.From}}
To: {{.To}}
Subject: {{.Subject}}
MIME-version: 1.0
Content-Type: text/html; charset="UTF-8"
<html><body>{{.Message}}</body></html>`
func NewMailerDaemon(host, username, password string, port int) *MailerDaemon {
daemon := new(MailerDaemon)
daemon.conf = &EmailConf{
Host: host,
Port: port,
UserName: username,
Password: password,
Auth: smtp.PlainAuth("", username, password, host),
Template: template.Must(template.New("emailTpl").Parse(emailScript)),
}
daemon.runner = task_runner.StartTaskRunner(2, os.Stdout)
return daemon
}
func (s *MailerDaemon) SendEmail(to, subject, message string, args... interface{}) {
task := NewEmailSendTask(taskParams{
From: "no-reply@kuber.com",
To: to,
Subject: subject,
Message: tpl.HTML(fmt.Sprintf(message, args...)),
}, s)
s.runner.EnqueueTask(task)
}
type taskParams struct {
From string
To string
Subject string
Message tpl.HTML
}
type emailTask struct {
params taskParams
sndr *MailerDaemon
tries int
}
func NewEmailSendTask(parms taskParams, sender *MailerDaemon) *emailTask {
return &emailTask{
params: parms,
sndr: sender,
tries: 3,
}
}
func (t *emailTask) Execute() {
var emailMessage bytes.Buffer
t.sndr.conf.Template.Execute(&emailMessage, &t.params)
err := smtp.SendMail(fmt.Sprintf("%s:%d", t.sndr.conf.Host, t.sndr.conf.Port), t.sndr.conf.Auth,
t.params.From, []string{t.params.To}, emailMessage.Bytes())
if err != nil && t.tries > 0 {
t.tries--
time.Sleep(100 * time.Millisecond)
t.Execute()
}
}