Merge branch 'EdwinLove-seven-bit-attachment'
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..010a846
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module github.com/EdwinLove/parsemail
+
+go 1.12
diff --git a/parsemail.go b/parsemail.go
index 3011f96..a8f84e8 100644
--- a/parsemail.go
+++ b/parsemail.go
@@ -37,7 +37,6 @@
return
}
-
switch contentType {
case contentTypeMultipartMixed:
email.TextBody, email.HTMLBody, email.Attachments, email.EmbeddedFiles, err = parseMultipartMixed(msg.Body, params["boundary"])
@@ -346,6 +345,13 @@
}
return bytes.NewReader(b), nil
+ case "7bit":
+ dd, err := ioutil.ReadAll(content)
+ if err != nil {
+ return nil, err
+ }
+
+ return bytes.NewReader(dd), nil
case "":
return content, nil
default:
diff --git a/parsemail_test.go b/parsemail_test.go
index 17ae024..5cc106a 100644
--- a/parsemail_test.go
+++ b/parsemail_test.go
@@ -2,6 +2,7 @@
import (
"encoding/base64"
+ "fmt"
"io/ioutil"
"net/mail"
"strings"
@@ -183,10 +184,10 @@
So, "Hello".`,
},
6: {
- mailData: data1,
+ mailData: data1,
contentType: `multipart/mixed; boundary=f403045f1dcc043a44054c8e6bbf`,
- content: "",
- subject: "Peter Paholík",
+ content: "",
+ subject: "Peter Paholík",
from: []mail.Address{
{
Name: "Peter Paholík",
@@ -204,17 +205,17 @@
htmlBody: "<div dir=\"ltr\"><br></div>",
attachments: []attachmentData{
{
- filename: "Peter Paholík 1 4 2017 2017-04-07.pdf",
- contentType: "application/pdf",
- base64data: "JVBERi0xLjQNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDY3IDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4vT3V0cHV0SW50ZW50c1s8PC9UeXBlL091dHB1dEludGVudC9TL0dUU19QREZBMS9PdXRwdXRDb25kZXYgMzk1MzYyDQo+Pg0Kc3RhcnR4cmVmDQo0MTk4ODUNCiUlRU9GDQo=",
+ filename: "Peter Paholík 1 4 2017 2017-04-07.json",
+ contentType: "application/json",
+ data: "[1, 2, 3]",
},
},
},
7: {
- mailData: data2,
+ mailData: data2,
contentType: `multipart/alternative; boundary="------------C70C0458A558E585ACB75FB4"`,
- content: "",
- subject: "Re: Test Subject 2",
+ content: "",
+ subject: "Re: Test Subject 2",
from: []mail.Address{
{
Name: "Sender Man",
@@ -270,15 +271,15 @@
Name: "Michael Jones",
Address: "mjones@machine.example",
},
- messageID: "1234@local.machine.example",
- date: parseDate("Fri, 21 Nov 1997 09:55:06 -0600"),
+ messageID: "1234@local.machine.example",
+ date: parseDate("Fri, 21 Nov 1997 09:55:06 -0600"),
contentType: `image/jpeg; x-unix-mode=0644; name="image.gif"`,
- content: `GIF89a;`,
+ content: `GIF89a;`,
},
9: {
contentType: `multipart/mixed; boundary="0000000000007e2bb40587e36196"`,
- mailData: textPlainInMultipart,
- subject: "Re: kern/54143 (virtualbox)",
+ mailData: textPlainInMultipart,
+ subject: "Re: kern/54143 (virtualbox)",
from: []mail.Address{
{
Name: "Rares",
@@ -291,7 +292,7 @@
Address: "bugs@example.com",
},
},
- date: parseDate("Fri, 02 May 2019 11:25:35 +0300"),
+ date: parseDate("Fri, 02 May 2019 11:25:35 +0300"),
textBody: `plain text part`,
},
10: {
@@ -330,6 +331,33 @@
date: parseDate("Tue, 01 Jul 2003 10:52:37 +0200"),
textBody: `Hi everyone.`,
},
+ 11: {
+ contentType: "multipart/mixed; boundary=f403045f1dcc043a44054c8e6bbf",
+ mailData: attachment7bit,
+ subject: "Peter Foobar",
+ from: []mail.Address{
+ {
+ Name: "Peter Foobar",
+ Address: "peter.foobar@gmail.com",
+ },
+ },
+ to: []mail.Address{
+ {
+ Name: "",
+ Address: "dusan@kasan.sk",
+ },
+ },
+ messageID: "CACtgX4kNXE7T5XKSKeH_zEcfUUmf2vXVASxYjaaK9cCn-3zb_g@mail.gmail.com",
+ date: parseDate("Tue, 02 Apr 2019 11:12:26 +0000"),
+ htmlBody: "<div dir=\"ltr\"><br></div>",
+ attachments: []attachmentData{
+ {
+ filename: "unencoded.csv",
+ contentType: "application/csv",
+ data: fmt.Sprintf("\n"+`"%s", "%s", "%s", "%s", "%s"`+"\n"+`"%s", "%s", "%s", "%s", "%s"`+"\n", "Some", "Data", "In", "Csv", "Format", "Foo", "Bar", "Baz", "Bum", "Poo"),
+ },
+ },
+ },
}
for index, td := range testData {
@@ -462,8 +490,7 @@
t.Error(err)
}
- encoded := base64.StdEncoding.EncodeToString(b)
- if ra.Filename == ad.filename && encoded == ad.base64data && ra.ContentType == ad.contentType {
+ if ra.Filename == ad.filename && string(b) == ad.data && ra.ContentType == ad.contentType {
found = true
attachs = append(attachs[:i], attachs[i+1:]...)
}
@@ -523,9 +550,9 @@
}
type attachmentData struct {
- filename string
- contentType string
- base64data string
+ filename string
+ contentType string
+ data string
}
type embeddedFileData struct {
@@ -616,19 +643,16 @@
--f403045f1dcc043a3f054c8e6bbd--
--f403045f1dcc043a44054c8e6bbf
-Content-Type: application/pdf;
+Content-Type: application/json;
name="=?UTF-8?Q?Peter_Paholi=CC=81k_1?=
- =?UTF-8?Q?_4_2017_2017=2D04=2D07=2Epdf?="
+ =?UTF-8?Q?_4_2017_2017=2D04=2D07=2Ejson?="
Content-Disposition: attachment;
filename="=?UTF-8?Q?Peter_Paholi=CC=81k_1?=
- =?UTF-8?Q?_4_2017_2017=2D04=2D07=2Epdf?="
+ =?UTF-8?Q?_4_2017_2017=2D04=2D07=2Ejson?="
Content-Transfer-Encoding: base64
X-Attachment-Id: f_j17i0f0d0
-JVBERi0xLjQNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFu
-Zyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDY3IDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4v
-T3V0cHV0SW50ZW50c1s8PC9UeXBlL091dHB1dEludGVudC9TL0dUU19QREZBMS9PdXRwdXRDb25k
-ZXYgMzk1MzYyDQo+Pg0Kc3RhcnR4cmVmDQo0MTk4ODUNCiUlRU9GDQo=
+WzEsIDIsIDNd
--f403045f1dcc043a44054c8e6bbf--
`
@@ -723,7 +747,6 @@
Hi everyone.
`
-
//todo: not yet implemented in net/mail
//once there is support for this, add it
var rfc5322exampleA13 = `From: Pete <pete@silly.example>
@@ -800,3 +823,38 @@
Content-Transfer-Encoding: base64
R0lGODlhAQE7`
+
+var attachment7bit = `From: =?UTF-8?Q?Peter_Foobar?= <peter.foobar@gmail.com>
+Date: Tue, 2 Apr 2019 11:12:26 +0000
+Message-ID: <CACtgX4kNXE7T5XKSKeH_zEcfUUmf2vXVASxYjaaK9cCn-3zb_g@mail.gmail.com>
+Subject: =?UTF-8?Q?Peter_Foobar?=
+To: dusan@kasan.sk
+Content-Type: multipart/mixed; boundary=f403045f1dcc043a44054c8e6bbf
+
+--f403045f1dcc043a44054c8e6bbf
+Content-Type: multipart/alternative; boundary=f403045f1dcc043a3f054c8e6bbd
+
+--f403045f1dcc043a3f054c8e6bbd
+Content-Type: text/plain; charset=UTF-8
+
+
+
+--f403045f1dcc043a3f054c8e6bbd
+Content-Type: text/html; charset=UTF-8
+
+<div dir="ltr"><br></div>
+
+--f403045f1dcc043a3f054c8e6bbd--
+--f403045f1dcc043a44054c8e6bbf
+Content-Type: application/csv;
+ name="unencoded.csv"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+ filename="unencoded.csv"
+
+
+"Some", "Data", "In", "Csv", "Format"
+"Foo", "Bar", "Baz", "Bum", "Poo"
+
+--f403045f1dcc043a44054c8e6bbf--
+`