diff --git a/README.md b/README.md index dd63f95..d13049e 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,26 @@ combine all needed module into one lib ``` +``` + +## Email + +```go +m := gomail.NewMessage() +m.SetHeader("From", "from@example.com") +m.SetHeader("To", "to@example.com") +m.SetHeader("Subject", "Hello!") +m.SetBody("text/plain", "Hello!") + +s := gomail.SendFunc(func(from string, to []string, msg io.WriterTo) error { + // Implements you email-sending function, for example by calling + // an API, or running postfix, etc. + fmt.Println("From:", from) + fmt.Println("To:", to) + return nil +}) + +if err := gomail.Send(s, m); err != nil { + panic(err) +} ``` \ No newline at end of file diff --git a/cmd/test/main.go b/cmd/test/main.go index 758eed3..33843f6 100644 --- a/cmd/test/main.go +++ b/cmd/test/main.go @@ -1,7 +1,11 @@ package main import ( + "time" + + "github.com/rs/zerolog/log" "kumoly.io/kumoly/app/auth" + "kumoly.io/kumoly/app/email" "kumoly.io/kumoly/app/history" "kumoly.io/kumoly/app/server" "kumoly.io/kumoly/app/store" @@ -18,7 +22,31 @@ func main() { auth.SetDB(store.DB) sys.Inject(auth.Injector(server.API)) - sys.Append(server, auth.New(server), &task.Service{}, &history.Service{}) - sys.Start() + sys.Append(server, auth.New(server), + &task.Service{}, &history.Service{}, + &email.Service{}) + go sys.Start() + + time.Sleep(time.Second) + err := email.Send("test@kumoly.io", + []string{"evanchen333@gmail.com"}, "Test Mail", + &email.Body{ + Greeting: "歡迎", + Signature: "Best Regards", + Content: ` +# Testing + +a|b|c +-|-|- +test|| + |is| + | |up`, + }, + ) + if err != nil { + log.Error().Err(err).Msg("failed to send email") + } + + <-sys.Done() } diff --git a/messenger/base.go b/email/base.go similarity index 57% rename from messenger/base.go rename to email/base.go index 5e38084..82f4a22 100644 --- a/messenger/base.go +++ b/email/base.go @@ -1,4 +1,4 @@ -package messenger +package email type App struct { Name string @@ -7,12 +7,11 @@ type App struct { Copyright string } -type Base struct { - App App - Title string - Intros []string - Outros []string - Markdown string +type Body struct { + App App + Intros []string + Outros []string + Content string Greeting string Receiver string diff --git a/messenger/base.gohtml b/email/base.gohtml similarity index 98% rename from messenger/base.gohtml rename to email/base.gohtml index 892f8a1..5c69b6c 100644 --- a/messenger/base.gohtml +++ b/email/base.gohtml @@ -295,8 +295,8 @@ {{ end }} {{/* Main Body */}} - {{ if (ne .Markdown "") }} - {{ .Markdown | ToHTML }} + {{ if (ne .Content "") }} + {{ .Content | ToHTML }} {{ else }}

No Body

{{ end }} diff --git a/messenger/base.gohtml.bak b/email/base.gohtml.bak similarity index 100% rename from messenger/base.gohtml.bak rename to email/base.gohtml.bak diff --git a/email/email.go b/email/email.go new file mode 100644 index 0000000..9ee4720 --- /dev/null +++ b/email/email.go @@ -0,0 +1,36 @@ +package email + +import ( + "github.com/spf13/viper" + "gopkg.in/gomail.v2" +) + +func init() { + // viper.SetDefault("email.type", "smtp") + viper.SetDefault("email.host", "mail.kumoly.io") + viper.SetDefault("email.port", 587) + viper.SetDefault("email.username", "test@kumoly.io") + viper.SetDefault("email.password", "test") +} + +// host string, port int, username string, password string +var dial *gomail.Dialer + +func Send(From string, To []string, Title string, b *Body) error { + + m := gomail.NewMessage() + m.SetHeader("From", From) + m.SetHeader("To", To...) + m.SetHeader("Subject", Title) + // m.SetAddressHeader("Cc", "dan@example.com", "Dan") + // m.Attach("/home/Alex/lolcat.jpg") + + body, err := Parse(b) + if err != nil { + return err + } + m.SetBody("text/html", body) + + // Send the email + return dial.DialAndSend(m) +} diff --git a/messenger/engine.go b/email/engine.go similarity index 64% rename from messenger/engine.go rename to email/engine.go index 03f6c41..785536d 100644 --- a/messenger/engine.go +++ b/email/engine.go @@ -1,4 +1,4 @@ -package messenger +package email import ( "bytes" @@ -16,22 +16,25 @@ var mailTmpl string var engine *template.Template var app App +var mdParser = goldmark.New( + goldmark.WithExtensions(extension.GFM), +) + func init() { - md := goldmark.New( - goldmark.WithExtensions(extension.GFM), - ) engine = template.Must(template.New("email").Funcs(template.FuncMap{ - "ToHTML": func(mdtext string) (string, error) { - var buf bytes.Buffer - if err := md.Convert([]byte(mdtext), &buf); err != nil { - return "", err - } - return buf.String(), nil - }, + "ToHTML": ToHTML, }).Parse(mailTmpl)) } -func Parse(b *Base) (string, error) { +func ToHTML(mdtext string) (template.HTML, error) { + var buf bytes.Buffer + if err := mdParser.Convert([]byte(mdtext), &buf); err != nil { + return "", err + } + return template.HTML(buf.String()), nil +} + +func Parse(b *Body) (string, error) { b.App = app buf := &bytes.Buffer{} err := engine.Execute(buf, b) diff --git a/messenger/service.go b/email/service.go similarity index 50% rename from messenger/service.go rename to email/service.go index edfb7db..669a4b3 100644 --- a/messenger/service.go +++ b/email/service.go @@ -1,23 +1,31 @@ -package messenger +package email import ( "fmt" "time" "github.com/spf13/viper" + "gopkg.in/gomail.v2" "kumoly.io/kumoly/app/system" ) -type Messenger struct { +type Service struct { system.BaseService } -func (srv Messenger) GetName() string { return "messenger.Messenger" } +func (srv Service) GetName() string { return "email.Service" } -func (srv *Messenger) Init() error { +func (srv *Service) Init() error { app.Name = viper.GetString("name") app.Copyright = fmt.Sprintf("Copyright © %v %s. All rights reserved.", time.Now().Year(), viper.GetString("name")) app.Link = viper.GetString("server.url") + + dial = gomail.NewDialer( + viper.GetString("email.host"), + viper.GetInt("email.port"), + viper.GetString("email.username"), + viper.GetString("email.password")) + return nil } diff --git a/messenger/text.tmpl b/email/text.tmpl similarity index 100% rename from messenger/text.tmpl rename to email/text.tmpl diff --git a/go.mod b/go.mod index 944cb55..870131e 100644 --- a/go.mod +++ b/go.mod @@ -60,6 +60,8 @@ require ( golang.org/x/sys v0.0.0-20211210111614-af8b64212486 // indirect golang.org/x/text v0.3.7 // indirect google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect + gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index c995562..bcd8ba2 100644 --- a/go.sum +++ b/go.sum @@ -289,10 +289,14 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= diff --git a/messenger/messenger.go b/messenger/messenger.go deleted file mode 100644 index d4f5a68..0000000 --- a/messenger/messenger.go +++ /dev/null @@ -1,5 +0,0 @@ -package messenger - -func init() { - // viper.SetDefault() -}