update
parent
c574b8ae6e
commit
06889facfb
22
README.md
22
README.md
|
@ -7,3 +7,25 @@ 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)
|
||||
}
|
||||
```
|
|
@ -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()
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -295,8 +295,8 @@
|
|||
{{ end }}
|
||||
|
||||
{{/* Main Body */}}
|
||||
{{ if (ne .Markdown "") }}
|
||||
{{ .Markdown | ToHTML }}
|
||||
{{ if (ne .Content "") }}
|
||||
{{ .Content | ToHTML }}
|
||||
{{ else }}
|
||||
<p>No Body</p>
|
||||
{{ end }}
|
|
@ -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)
|
||||
}
|
|
@ -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)
|
|
@ -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
|
||||
}
|
2
go.mod
2
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
|
||||
)
|
||||
|
|
4
go.sum
4
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=
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
package messenger
|
||||
|
||||
func init() {
|
||||
// viper.SetDefault()
|
||||
}
|
Loading…
Reference in New Issue