sendgrid-go icon indicating copy to clipboard operation
sendgrid-go copied to clipboard

Example in documentation for parse helper doesn't work

Open phillipbroberts opened this issue 5 years ago • 4 comments

Issue Summary

The example in the readme for helper/inbound does not work.

Steps to Reproduce

  1. Cut and Paste Example
  2. Run Code
  3. Point a parser domain to it
  4. Send email to [email protected]

Code Snippet

package main

import (
	"fmt"
	"log"
	"net/http"

	"github.com/sendgrid/sendgrid-go/helpers/inbound"
)


func inboundHandler(response http.ResponseWriter, request *http.Request) {
	parsedEmail := inbound.Parse(request)

	fmt.Print(parsedEmail.Headers["From"])

	for filename, contents := range parsedEmail.Attachments {
		// Do something with an attachment
		//handleAttachment(filename, contents)
		fmt.Print(filename, contents)
	}

	for section, body := range parsedEmail.Body {
		// Do something with the email body
		//handleEmail(body)
		fmt.Print(section, body)
	}

	// Twilio SendGrid needs a 200 OK response to stop POSTing
	response.WriteHeader(http.StatusOK)
}

func main() {
	http.HandleFunc("/inbound", inboundHandler)
	if err := http.ListenAndServe(":8000", nil); err != nil {
		log.Fatalln("Error")
	}
}


Exception/Log

2020/07/02 16:51:40 http: panic serving 10.244.0.50:40980: runtime error: index out of range [1] with length 1
goroutine 21 [running]:
net/http.(*conn).serve.func1(0xc000072f00)
	/usr/local/go/src/net/http/server.go:1772 +0x139
panic(0x6d76a0, 0xc0001d8780)
	/usr/local/go/src/runtime/panic.go:975 +0x3e3
github.com/sendgrid/sendgrid-go/helpers/inbound.(*ParsedEmail).parseHeaders(0xc0000cb630, 0xc000143c00, 0xb14)
	/go/src/github.com/sendgrid/sendgrid-go/helpers/inbound/inbound.go:100 +0x19c
github.com/sendgrid/sendgrid-go/helpers/inbound.(*ParsedEmail).parse(0xc0000cb630)
	/go/src/github.com/sendgrid/sendgrid-go/helpers/inbound/inbound.go:40 +0x180
github.com/sendgrid/sendgrid-go/helpers/inbound.Parse(...)
	/go/src/github.com/sendgrid/sendgrid-go/helpers/inbound/inbound.go:28
main.inboundHandler(0x7637c0, 0xc0000a4700, 0xc0000c0900)
	/go/src/app/main.go:20 +0x1b1
net/http.HandlerFunc.ServeHTTP(0x70fca0, 0x7637c0, 0xc0000a4700, 0xc0000c0900)
	/usr/local/go/src/net/http/server.go:2012 +0x44
net/http.(*ServeMux).ServeHTTP(0x93e300, 0x7637c0, 0xc0000a4700, 0xc0000c0900)
	/usr/local/go/src/net/http/server.go:2387 +0x1a5
net/http.serverHandler.ServeHTTP(0xc0000a4000, 0x7637c0, 0xc0000a4700, 0xc0000c0900)
	/usr/local/go/src/net/http/server.go:2807 +0xa3
net/http.(*conn).serve(0xc000072f00, 0x763d80, 0xc00004cb80)
	/usr/local/go/src/net/http/server.go:1895 +0x86c
created by net/http.(*Server).Serve
	/usr/local/go/src/net/http/server.go:2933 +0x35c

Technical details:

  • sendgrid-go version: Latest
  • go version: 1.14

phillipbroberts avatar Jul 02 '20 16:07 phillipbroberts

@phillipbroberts

Looks like it's having an issue parsing the email header portion. Can you please include an example of the inbound email request body so I can run further tests?

eshanholtz avatar Jul 06 '20 18:07 eshanholtz

I didn't have the service up anymore - the best I could do is send an email from the address I was using to send test emails to one of my other email addresses - hope this is helpful.

Date: Wed, 08 Jul 2020 09:40:47 -0400
Subject: test
From: Phillip Roberts <[email protected]>
To: Phillip Roberts <[email protected]>
Message-ID: <[email protected]>
Thread-Topic: test
Thread-Index: AUJERDQ2q08BPjBZqFLNp1WxpBNfMg==
Mime-version: 1.0
Content-type: multipart/alternative;
	boundary="B_3677046411_2029731371"

> This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

--B_3677046411_2029731371
Content-type: text/plain;
	charset="UTF-8"
Content-transfer-encoding: 7bit

test


--B_3677046411_2029731371
Content-type: text/html;
	charset="UTF-8"
Content-transfer-encoding: quoted-printable

<html><head>
<meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf-8"><meta co=
ntent=3D"text/html; charset=3Dutf-8"><meta name=3D"Generator" content=3D"Microsoft W=
ord 15 (filtered medium)"><style>
<!--
@font-face
	{font-family:"Cambria Math"}
@font-face
	{font-family:Calibri}
p.MsoNormal, li.MsoNormal, div.MsoNormal
	{margin:0in;
	margin-bottom:.0001pt;
	font-size:12.0pt;
	font-family:"Calibri",sans-serif}
span.EmailStyle17
	{font-family:"Calibri",sans-serif;
	color:windowtext}
.MsoChpDefault
	{font-size:12.0pt;
	font-family:"Calibri",sans-serif}
@page WordSection1
	{margin:1.0in 1.0in 1.0in 1.0in}
div.WordSection1
	{}
-->
</style></head><body lang=3D"EN-US" link=3D"#0563C1" vlink=3D"#954F72"><div class=
=3D"WordSection1"><p class=3D"MsoNormal"><span style=3D"font-size:11.0pt">test</sp=
an></p></div></body></html>

--B_3677046411_2029731371--

phillipbroberts avatar Jul 08 '20 13:07 phillipbroberts

I was able to recreate this bug. This issue has been added to our internal backlog to be prioritized. Pull requests and +1s on the issue summary will help it move up the backlog.

eshanholtz avatar Jul 14 '20 16:07 eshanholtz

For whoever gets around to working on this (I may try to open a PR later if I'm free), I dug around a little and think I figured out the cause of the issue (or at least the cause of an issue):

https://github.com/sendgrid/sendgrid-go/blob/52264b866fe06cdf99aabb66640795e68aed36c9/helpers/inbound/inbound.go#L36

I wrote a quick program that logs the keys of the req.MultipartForm.Value map, producing the following:

2020/12/21 00:50:20 value key: "dkim"
2020/12/21 00:50:20 value key: "attachments"
2020/12/21 00:50:20 value key: "sender_ip"
2020/12/21 00:50:20 value key: "charsets"
2020/12/21 00:50:20 value key: "content-ids"
2020/12/21 00:50:20 value key: "html"
2020/12/21 00:50:20 value key: "envelope"
2020/12/21 00:50:20 value key: "attachment-info"
2020/12/21 00:50:20 value key: "from"
2020/12/21 00:50:20 value key: "text"
2020/12/21 00:50:20 value key: "subject"
2020/12/21 00:50:20 value key: "SPF"
2020/12/21 00:50:20 value key: "headers"
2020/12/21 00:50:20 value key: "to"

Point being, there is no "email" field. Instead, it appears that much of the information parseRawEmail tries to extract, e.g. attachments, text content, etc., are already pre-extracted by the inbound parse hook and provided in the "attachments", "attachment-info", "text", etc. keys.

That also means that the documentation (specifically the "sample payload" snippet) here should be updated to reflect the actual payload shape.

kwshi avatar Dec 21 '20 02:12 kwshi