From 5a94f967cf0d03c9d073c9353d6ba34f5136f348 Mon Sep 17 00:00:00 2001 From: mgoeppe Date: Tue, 8 Mar 2022 11:00:18 +0100 Subject: [PATCH] fix: inner mime type quoted-printable * [multipart.Reader.NextPart()](https://pkg.go.dev/mime/multipart#Reader.NextPart) hides the Content-Transfer encoding. Therefor I switched to `NextRawPart()` and needed to add the decoding to the `decodeContent(..)` func. * I also could have changed the detection of embedded files, sticked to `NextPart()` and used the mime decoding of multipart itself. I decided against that approach in order to stick close to your implementation. --- parsemail.go | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/parsemail.go b/parsemail.go index 6a60192..25b8444 100644 --- a/parsemail.go +++ b/parsemail.go @@ -8,6 +8,7 @@ import ( "io/ioutil" "mime" "mime/multipart" + "mime/quotedprintable" "net/mail" "strings" "time" @@ -106,7 +107,7 @@ func parseContentType(contentTypeHeader string) (contentType string, params map[ func parseMultipartRelated(msg io.Reader, boundary string) (textBody, htmlBody string, embeddedFiles []EmbeddedFile, err error) { pmr := multipart.NewReader(msg, boundary) for { - part, err := pmr.NextPart() + part, err := pmr.NextRawPart() if err == io.EOF { break @@ -163,7 +164,7 @@ func parseMultipartRelated(msg io.Reader, boundary string) (textBody, htmlBody s func parseMultipartAlternative(msg io.Reader, boundary string) (textBody, htmlBody string, embeddedFiles []EmbeddedFile, err error) { pmr := multipart.NewReader(msg, boundary) for { - part, err := pmr.NextPart() + part, err := pmr.NextRawPart() if err == io.EOF { break @@ -220,7 +221,7 @@ func parseMultipartAlternative(msg io.Reader, boundary string) (textBody, htmlBo func parseMultipartMixed(msg io.Reader, boundary string) (textBody, htmlBody string, attachments []Attachment, embeddedFiles []EmbeddedFile, err error) { mr := multipart.NewReader(msg, boundary) for { - part, err := mr.NextPart() + part, err := mr.NextRawPart() if err == io.EOF { break } else if err != nil { @@ -361,6 +362,14 @@ func decodeContent(content io.Reader, encoding string) (io.Reader, error) { } return bytes.NewReader(dd), nil + case "quoted-printable": + decoded := quotedprintable.NewReader(content) + b, err := ioutil.ReadAll(decoded) + if err != nil { + return nil, err + } + + return bytes.NewReader(b), nil case "": return content, nil default: @@ -483,11 +492,11 @@ type Email struct { ResentMessageID string ContentType string - Content io.Reader + Content io.Reader HTMLBody string TextBody string Attachments []Attachment EmbeddedFiles []EmbeddedFile -} \ No newline at end of file +}