|
|
@@ -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
|
|
|
+}
|