statping/notifiers/email.go

178 lines
4.3 KiB
Go
Raw Normal View History

2020-03-12 08:09:25 +00:00
package notifiers
import (
"bytes"
"crypto/tls"
"fmt"
"github.com/go-mail/mail"
"github.com/statping/statping/types/core"
2020-03-09 18:17:55 +00:00
"github.com/statping/statping/types/failures"
2020-03-14 03:13:20 +00:00
"github.com/statping/statping/types/notifications"
"github.com/statping/statping/types/notifier"
2020-03-09 18:17:55 +00:00
"github.com/statping/statping/types/services"
"github.com/statping/statping/utils"
"html/template"
)
2020-03-14 03:13:20 +00:00
var _ notifier.Notifier = (*emailer)(nil)
2020-03-09 15:15:15 +00:00
var (
mailer *mail.Dialer
)
2020-03-14 03:13:20 +00:00
type emailer struct {
*notifications.Notification
}
2020-03-14 03:13:20 +00:00
func (e *emailer) Select() *notifications.Notification {
return e.Notification
}
var email = &emailer{&notifications.Notification{
Method: "email",
2020-06-21 07:16:13 +00:00
Title: "SMTP Mail",
2018-09-28 06:57:03 +00:00
Description: "Send emails via SMTP when services are online or offline.",
Author: "Hunter Long",
AuthorUrl: "https://github.com/hunterlong",
2018-10-21 16:22:26 +00:00
Icon: "far fa-envelope",
2020-03-17 03:13:07 +00:00
Limits: 30,
2020-03-14 03:13:20 +00:00
Form: []notifications.NotificationForm{{
Type: "text",
Title: "SMTP Host",
Placeholder: "Insert your SMTP Host here.",
DbField: "Host",
}, {
Type: "text",
Title: "SMTP Username",
Placeholder: "Insert your SMTP Username here.",
DbField: "Username",
}, {
Type: "password",
Title: "SMTP Password",
Placeholder: "Insert your SMTP Password here.",
DbField: "Password",
}, {
Type: "number",
Title: "SMTP Port",
Placeholder: "Insert your SMTP Port here.",
DbField: "Port",
}, {
Type: "text",
2019-01-17 21:11:43 +00:00
Title: "Outgoing Email Address",
Placeholder: "outgoing@email.com",
DbField: "Var1",
}, {
Type: "email",
Title: "Send Alerts To",
2019-01-17 21:11:43 +00:00
Placeholder: "sendto@email.com",
DbField: "Var2",
2019-04-03 15:34:16 +00:00
}, {
Type: "switch",
2019-04-03 15:34:16 +00:00
Title: "Disable TLS/SSL",
Placeholder: "",
SmallText: "Enabling this will set Insecure Skip Verify to true",
2019-04-03 15:34:16 +00:00
DbField: "api_key",
2020-03-14 03:13:20 +00:00
}}},
2018-07-12 06:53:18 +00:00
}
2018-10-06 05:03:10 +00:00
type emailOutgoing struct {
2018-07-17 09:18:20 +00:00
To string
Subject string
Template string
From string
Data replacer
2018-07-17 09:18:20 +00:00
Source string
Sent bool
}
2018-09-15 22:39:17 +00:00
// OnFailure will trigger failing service
func (e *emailer) OnFailure(s services.Service, f failures.Failure) (string, error) {
subject := fmt.Sprintf("Service %s is Offline", s.Name)
tmpl := renderEmail(s, f)
2018-10-06 05:03:10 +00:00
email := &emailOutgoing{
To: e.Var2,
Subject: subject,
Template: tmpl,
From: e.Var1,
}
return tmpl, e.dialSend(email)
}
2018-09-15 22:39:17 +00:00
// OnSuccess will trigger successful service
func (e *emailer) OnSuccess(s services.Service) (string, error) {
subject := fmt.Sprintf("Service %s is Back Online", s.Name)
tmpl := renderEmail(s, failures.Failure{})
2020-03-14 03:13:20 +00:00
email := &emailOutgoing{
To: e.Var2,
Subject: subject,
Template: tmpl,
From: e.Var1,
}
return tmpl, e.dialSend(email)
}
func renderEmail(s services.Service, f failures.Failure) string {
wr := bytes.NewBuffer(nil)
tmpl := template.New("email")
tmpl, err := tmpl.Parse(emailBase)
if err != nil {
log.Errorln(err)
return emailBase
}
data := replacer{
Core: *core.App,
Service: s,
Failure: f,
Custom: nil,
}
if err = tmpl.ExecuteTemplate(wr, "email", data); err != nil {
log.Errorln(err)
return emailBase
}
return wr.String()
}
// OnTest triggers when this notifier has been saved
func (e *emailer) OnTest() (string, error) {
service := services.Example(true)
subject := fmt.Sprintf("Service %v is Back Online", service.Name)
email := &emailOutgoing{
To: e.Var2,
Subject: subject,
Template: renderEmail(service, failures.Example()),
From: e.Var1,
}
return subject, e.dialSend(email)
}
2020-06-21 06:52:07 +00:00
// OnSave will trigger when this notifier is saved
func (e *emailer) OnSave() (string, error) {
return "", nil
}
func (e *emailer) dialSend(email *emailOutgoing) error {
mailer = mail.NewDialer(e.Host, e.Port, e.Username, e.Password)
m := mail.NewMessage()
2019-04-03 15:34:16 +00:00
// if email setting TLS is Disabled
if e.ApiKey == "true" {
2019-04-03 15:34:16 +00:00
mailer.SSL = false
} else {
mailer.TLSConfig = &tls.Config{InsecureSkipVerify: true}
}
m.SetAddressHeader("From", email.From, "Statping")
2018-07-12 06:53:18 +00:00
m.SetHeader("To", email.To)
m.SetHeader("Subject", email.Subject)
m.SetBody("text/html", email.Template)
2020-03-25 18:46:50 +00:00
2018-07-16 07:02:33 +00:00
if err := mailer.DialAndSend(m); err != nil {
utils.Log.Errorln(fmt.Sprintf("email '%v' sent to: %v (size: %v) %v", email.Subject, email.To, len([]byte(email.Source)), err))
2018-07-12 06:53:18 +00:00
return err
}
2018-07-12 06:53:18 +00:00
return nil
}