From 09f047ab8bebb10514ed0135bcb26cb19fa484f7 Mon Sep 17 00:00:00 2001 From: Fabrizio Steiner Date: Tue, 23 Jan 2018 20:05:18 +0100 Subject: [PATCH] Send mails that correspond to RFC2045 with a base64 line limit of 76 characters. --- notifications/email.go | 7 ++++++- notifications/util.go | 24 ++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 notifications/util.go diff --git a/notifications/email.go b/notifications/email.go index 6850ca9..5380f7f 100644 --- a/notifications/email.go +++ b/notifications/email.go @@ -72,7 +72,12 @@ func (e *emailTypeNotifier) buildMessage(entries []*log.Entry) []byte { for k, v := range header { message += fmt.Sprintf("%s: %s\r\n", k, v) } - message += "\r\n" + base64.StdEncoding.EncodeToString([]byte(body)) + + encodedBody := base64.StdEncoding.EncodeToString([]byte(body)) + //RFC 2045 base64 encoding demands line no longer than 76 characters. + for _, line := range SplitSubN(encodedBody, 76) { + message += "\r\n" + line + } return []byte(message) } diff --git a/notifications/util.go b/notifications/util.go new file mode 100644 index 0000000..5764341 --- /dev/null +++ b/notifications/util.go @@ -0,0 +1,24 @@ +package notifications + +import "bytes" + +// SplitSubN splits a string into a list of string with each having +// a maximum number of characters n +func SplitSubN(s string, n int) []string { + sub := "" + subs := []string{} + + runes := bytes.Runes([]byte(s)) + l := len(runes) + for i, r := range runes { + sub = sub + string(r) + if (i+1)%n == 0 { + subs = append(subs, sub) + sub = "" + } else if (i + 1) == l { + subs = append(subs, sub) + } + } + + return subs +}