package notify import ( "github.com/ouqiang/gocron/models" "github.com/ouqiang/gocron/modules/logger" "strconv" "strings" "github.com/ouqiang/gocron/modules/utils" "time" "github.com/go-gomail/gomail" ) // @author qiang.ou // @date 2017/5/1-00:19 type Mail struct { } func (mail *Mail) Send(msg Message) { model := new(models.Setting) mailSetting, err := model.Mail() logger.Debugf("%+v", mailSetting) if err != nil { logger.Error("#mail#从数据库获取mail配置失败", err) return } if mailSetting.Host == "" { logger.Error("#mail#Host为空") return } if mailSetting.Port == 0 { logger.Error("#mail#Port为空") return } if mailSetting.User == "" { logger.Error("#mail#User为空") return } if mailSetting.Password == "" { logger.Error("#mail#Password为空") return } toUsers := mail.getActiveMailUsers(mailSetting, msg) mail.send(mailSetting, toUsers, msg) } func (mail *Mail) send(mailSetting models.Mail, toUsers []string, msg Message) { body := msg["content"].(string) body = strings.Replace(body, "\n", "
", -1) gomailMessage := gomail.NewMessage() gomailMessage.SetHeader("From", mailSetting.User) gomailMessage.SetHeader("To", toUsers...) gomailMessage.SetHeader("Subject", "gocron-定时任务监控通知") gomailMessage.SetBody("text/html", body) mailer := gomail.NewPlainDialer(mailSetting.Host, mailSetting.Port, mailSetting.User, mailSetting.Password) maxTimes := 3 i := 0 for i < maxTimes { err := mailer.DialAndSend(gomailMessage) if err == nil { break; } i += 1 time.Sleep(2 * time.Second) if i < maxTimes { logger.Error("mail#发送消息失败#%s#消息内容-%s", err.Error(), msg["content"]) } } } func (mail *Mail) getActiveMailUsers(mailSetting models.Mail, msg Message) []string { taskReceiverIds := strings.Split(msg["task_receiver_id"].(string), ",") users := []string{} for _, v := range(mailSetting.MailUsers) { if utils.InStringSlice(taskReceiverIds, strconv.Itoa(v.Id)) { users = append(users, v.Email) } } return users }