|
|
|
@ -9,13 +9,15 @@ import ( |
|
|
|
|
"crypto/tls" |
|
|
|
|
"fmt" |
|
|
|
|
"html/template" |
|
|
|
|
"io" |
|
|
|
|
"net" |
|
|
|
|
"strconv" |
|
|
|
|
|
|
|
|
|
gomail "gopkg.in/mail.v2" |
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/models" |
|
|
|
|
"github.com/grafana/grafana/pkg/setting" |
|
|
|
|
"github.com/grafana/grafana/pkg/util/errutil" |
|
|
|
|
gomail "gopkg.in/mail.v2" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func (ns *NotificationService) send(msg *Message) (int, error) { |
|
|
|
@ -30,8 +32,11 @@ func (ns *NotificationService) send(msg *Message) (int, error) { |
|
|
|
|
m.SetHeader("From", msg.From) |
|
|
|
|
m.SetHeader("To", address) |
|
|
|
|
m.SetHeader("Subject", msg.Subject) |
|
|
|
|
for _, file := range msg.EmbededFiles { |
|
|
|
|
m.Embed(file) |
|
|
|
|
|
|
|
|
|
ns.setFiles(m, msg) |
|
|
|
|
|
|
|
|
|
for _, replyTo := range msg.ReplyTo { |
|
|
|
|
m.SetAddressHeader("Reply-To", replyTo, "") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
m.SetBody("text/html", msg.Body) |
|
|
|
@ -48,6 +53,23 @@ func (ns *NotificationService) send(msg *Message) (int, error) { |
|
|
|
|
return num, err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// setFiles attaches files in various forms
|
|
|
|
|
func (ns *NotificationService) setFiles( |
|
|
|
|
m *gomail.Message, |
|
|
|
|
msg *Message, |
|
|
|
|
) { |
|
|
|
|
for _, file := range msg.EmbededFiles { |
|
|
|
|
m.Embed(file) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, file := range msg.AttachedFiles { |
|
|
|
|
m.Attach(file.Name, gomail.SetCopyFunc(func(writer io.Writer) error { |
|
|
|
|
_, err := writer.Write(file.Content) |
|
|
|
|
return err |
|
|
|
|
})) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (ns *NotificationService) createDialer() (*gomail.Dialer, error) { |
|
|
|
|
host, port, err := net.SplitHostPort(ns.Cfg.Smtp.Host) |
|
|
|
|
|
|
|
|
@ -127,10 +149,27 @@ func (ns *NotificationService) buildEmailMessage(cmd *models.SendEmailCommand) ( |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return &Message{ |
|
|
|
|
To: cmd.To, |
|
|
|
|
From: fmt.Sprintf("%s <%s>", ns.Cfg.Smtp.FromName, ns.Cfg.Smtp.FromAddress), |
|
|
|
|
Subject: subject, |
|
|
|
|
Body: buffer.String(), |
|
|
|
|
EmbededFiles: cmd.EmbededFiles, |
|
|
|
|
To: cmd.To, |
|
|
|
|
From: fmt.Sprintf("%s <%s>", ns.Cfg.Smtp.FromName, ns.Cfg.Smtp.FromAddress), |
|
|
|
|
Subject: subject, |
|
|
|
|
Body: buffer.String(), |
|
|
|
|
EmbededFiles: cmd.EmbededFiles, |
|
|
|
|
AttachedFiles: buildAttachedFiles(cmd.AttachedFiles), |
|
|
|
|
}, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// buildAttachedFiles build attached files
|
|
|
|
|
func buildAttachedFiles( |
|
|
|
|
attached []*models.SendEmailAttachFile, |
|
|
|
|
) []*AttachedFile { |
|
|
|
|
result := make([]*AttachedFile, 0) |
|
|
|
|
|
|
|
|
|
for _, file := range attached { |
|
|
|
|
result = append(result, &AttachedFile{ |
|
|
|
|
Name: file.Name, |
|
|
|
|
Content: file.Content, |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result |
|
|
|
|
} |
|
|
|
|