mirror of https://github.com/shunfei/cronsun
noticer: 发送邮件通知
parent
a715b16849
commit
48d8565690
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/cockroachdb/cmux"
|
||||
|
||||
|
@ -33,6 +34,13 @@ func main() {
|
|||
return
|
||||
}
|
||||
|
||||
noticer, err := models.NewMail(10 * time.Second)
|
||||
if err != nil {
|
||||
log.Error(err.Error())
|
||||
return
|
||||
}
|
||||
go models.StartNoticer(noticer)
|
||||
|
||||
go func() {
|
||||
err := httpServer.Serve(httpL)
|
||||
if err != nil {
|
||||
|
|
|
@ -49,6 +49,7 @@ type Conf struct {
|
|||
Once string // 马上执行任务路径
|
||||
Lock string // job lock 路径
|
||||
Group string // 节点分组
|
||||
Noticer string // 通知
|
||||
|
||||
Ttl int64 // 节点超时时间,单位秒
|
||||
ReqTimeout int // 请求超时时间,单位秒
|
||||
|
@ -128,10 +129,13 @@ func (c *Conf) parse() error {
|
|||
}
|
||||
log.InitConf(c.Log)
|
||||
|
||||
c.Cmd = cleanKeyPrefix(c.Cmd)
|
||||
c.Node = cleanKeyPrefix(c.Node)
|
||||
c.Proc = cleanKeyPrefix(c.Proc)
|
||||
c.Cmd = cleanKeyPrefix(c.Cmd)
|
||||
c.Once = cleanKeyPrefix(c.Once)
|
||||
c.Lock = cleanKeyPrefix(c.Lock)
|
||||
c.Group = cleanKeyPrefix(c.Group)
|
||||
c.Noticer = cleanKeyPrefix(c.Noticer)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
@ -185,7 +189,7 @@ func (c *Conf) reload() {
|
|||
}
|
||||
|
||||
// etcd key 选项需要重启
|
||||
cf.Node, cf.Proc, cf.Cmd, cf.Once, cf.Lock, cf.Group = c.Node, c.Proc, c.Cmd, c.Once, c.Lock, c.Group
|
||||
cf.Node, cf.Proc, cf.Cmd, cf.Once, cf.Lock, cf.Group, cf.Noticer = c.Node, c.Proc, c.Cmd, c.Once, c.Lock, c.Group, c.Noticer
|
||||
|
||||
*c = *cf
|
||||
log.Noticef("config file[%s] reload success", *confFile)
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
"Once": "/cronsun/once/",
|
||||
"Lock": "/cronsun/lock/",
|
||||
"Group": "/cronsun/group/",
|
||||
"Noticer": "/cronsun/noticer/",
|
||||
"#Ttl": "节点超时时间,单位秒",
|
||||
"Ttl": 10,
|
||||
"#ReqTimeout": "etcd 请求超时时间,单位秒",
|
||||
|
|
|
@ -1,8 +1,11 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
client "github.com/coreos/etcd/clientv3"
|
||||
"github.com/go-gomail/gomail"
|
||||
|
||||
"sunteng/commons/log"
|
||||
|
@ -28,9 +31,25 @@ type Mail struct {
|
|||
msgChan chan *Message
|
||||
}
|
||||
|
||||
func NewMail() (m *Mail, err error) {
|
||||
cf := conf.Config.Mail
|
||||
sc, err := cf.Dialer.Dial()
|
||||
func NewMail(timeout time.Duration) (m *Mail, err error) {
|
||||
var (
|
||||
sc gomail.SendCloser
|
||||
done = make(chan struct{})
|
||||
cf = conf.Config.Mail
|
||||
)
|
||||
|
||||
// qq 邮箱的 Auth 出错后, 501 命令超时 2min 才能退出
|
||||
go func() {
|
||||
sc, err = cf.Dialer.Dial()
|
||||
close(done)
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-done:
|
||||
case <-time.After(timeout):
|
||||
err = fmt.Errorf("connect to smtp timeout")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
@ -47,6 +66,7 @@ func NewMail() (m *Mail, err error) {
|
|||
|
||||
func (m *Mail) Serve() {
|
||||
var err error
|
||||
sm := gomail.NewMessage()
|
||||
for {
|
||||
select {
|
||||
case msg := <-m.msgChan:
|
||||
|
@ -59,7 +79,7 @@ func (m *Mail) Serve() {
|
|||
m.open = true
|
||||
}
|
||||
|
||||
sm := gomail.NewMessage()
|
||||
sm.Reset()
|
||||
sm.SetHeader("From", m.cf.Username)
|
||||
sm.SetHeader("To", msg.To...)
|
||||
sm.SetHeader("Subject", msg.Subject)
|
||||
|
@ -79,3 +99,26 @@ func (m *Mail) Serve() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Mail) Send(msg *Message) {
|
||||
m.msgChan <- msg
|
||||
}
|
||||
|
||||
func StartNoticer(n Noticer) {
|
||||
go n.Serve()
|
||||
rch := DefalutClient.Watch(conf.Config.Noticer, client.WithPrefix())
|
||||
var err error
|
||||
for wresp := range rch {
|
||||
for _, ev := range wresp.Events {
|
||||
switch {
|
||||
case ev.IsCreate(), ev.IsModify():
|
||||
msg := new(Message)
|
||||
if err = json.Unmarshal(ev.Kv.Value, msg); err != nil {
|
||||
log.Warnf("msg[%s] umarshal err: %s", string(ev.Kv.Value), err.Error())
|
||||
continue
|
||||
}
|
||||
n.Send(msg)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue