diff --git a/pkg/message/build_rfc822.go b/pkg/message/build_rfc822.go index 026381f2..fa778006 100644 --- a/pkg/message/build_rfc822.go +++ b/pkg/message/build_rfc822.go @@ -494,7 +494,10 @@ func toMessageHeader(hdr mail.Header) message.Header { for key, val := range hdr { for _, val := range val { - res.Add(key, val) + // Using AddRaw instead of Add to save key-value pair as byte buffer within Header. + // This buffer is used latter on in message writer to construct message and avoid crash + // when key length is more than 76 characters long. + res.AddRaw([]byte(key + ": " + val + "\r\n")) } } diff --git a/pkg/message/build_test.go b/pkg/message/build_test.go index 7278e6db..d95f6824 100644 --- a/pkg/message/build_test.go +++ b/pkg/message/build_test.go @@ -52,6 +52,27 @@ func TestBuildPlainMessage(t *testing.T) { expectTransferEncoding(is(`quoted-printable`)) } +func TestBuildPlainMessageWithLongKey(t *testing.T) { + m := gomock.NewController(t) + defer m.Finish() + + b := NewBuilder(1, 1, 1) + defer b.Done() + + kr := tests.MakeKeyRing(t) + msg := newTestMessage(t, kr, "messageID", "addressID", "text/plain", "body", time.Now()) + msg.Header["ReallyVeryVeryVeryVeryVeryLongLongLongLongLongLongLongKeyThatWillHaveNotSoLongValue"] = []string{"value"} + + res, err := b.NewJob(context.Background(), newTestFetcher(m, kr, msg), msg.ID).GetResult() + require.NoError(t, err) + + section(t, res). + expectContentType(is(`text/plain`)). + expectBody(is(`body`)). + expectTransferEncoding(is(`quoted-printable`)). + expectHeader(`ReallyVeryVeryVeryVeryVeryLongLongLongLongLongLongLongKeyThatWillHaveNotSoLongValue`, is(`value`)) +} + func TestBuildHTMLMessage(t *testing.T) { m := gomock.NewController(t) defer m.Finish()