Skip to content

Commit a49b446

Browse files
committed
Fix inbound email panic
tadhunt/minecraft-playdates-issues#381 by integrating sendgrid#461
1 parent bdbdc21 commit a49b446

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

helpers/inbound/go.mod

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
module inbound
2+
3+
go 1.19
4+
5+
require github.com/stretchr/testify v1.8.4
6+
7+
require (
8+
github.com/davecgh/go-spew v1.1.1 // indirect
9+
github.com/pmezard/go-difflib v1.0.0 // indirect
10+
gopkg.in/yaml.v3 v3.0.1 // indirect
11+
)

helpers/inbound/go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
6+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
7+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
8+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
9+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
10+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

helpers/inbound/inbound.go

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"io"
77
"mime"
88
"mime/multipart"
9+
"mime/quotedprintable"
910
"net/http"
1011
"strings"
1112
)
@@ -167,10 +168,34 @@ func (email *ParsedEmail) parseRawEmail(rawEmail string) error {
167168
return err
168169
}
169170

171+
// if Content-Type is not multipart just set the whole email
172+
if raw == nil {
173+
if len(sections) < 2 {
174+
return nil
175+
}
176+
177+
wholeEmail := sections[1]
178+
// decode if needed
179+
if email.Headers["Content-Transfer-Encoding"] == "quoted-printable" {
180+
decoded, err := io.ReadAll(quotedprintable.NewReader(strings.NewReader(wholeEmail)))
181+
if err != nil {
182+
return err
183+
}
184+
wholeEmail = string(decoded)
185+
}
186+
187+
email.Body[email.Headers["Content-Type"]] = wholeEmail
188+
return nil
189+
}
190+
170191
for {
171192
emailPart, err := raw.NextPart()
172-
if err == io.EOF {
173-
return nil
193+
// Check for both io.EOF and the wrapped multipart: NextPart: EOF
194+
if err == io.EOF || (err != nil && err.Error() == "multipart: NextPart: EOF") {
195+
break
196+
}
197+
if err != nil {
198+
return err
174199
}
175200
rawEmailBody, err := parseMultipart(emailPart, emailPart.Header.Get("Content-Type"))
176201
if err != nil {
@@ -179,9 +204,13 @@ func (email *ParsedEmail) parseRawEmail(rawEmail string) error {
179204
if rawEmailBody != nil {
180205
for {
181206
emailBodyPart, err := rawEmailBody.NextPart()
182-
if err == io.EOF {
207+
// Check for both io.EOF and the wrapped multipart: NextPart: EOF
208+
if err == io.EOF || (err != nil && err.Error() == "multipart: NextPart: EOF") {
183209
break
184210
}
211+
if err != nil {
212+
return err
213+
}
185214
header := emailBodyPart.Header.Get("Content-Type")
186215
b, err := io.ReadAll(emailPart)
187216
if err != nil {
@@ -206,6 +235,7 @@ func (email *ParsedEmail) parseRawEmail(rawEmail string) error {
206235
email.Body[header] = string(b)
207236
}
208237
}
238+
return nil
209239
}
210240

211241
func parseMultipart(body io.Reader, contentType string) (*multipart.Reader, error) {

0 commit comments

Comments
 (0)