Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 41 additions & 1 deletion cloudmailin.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package cloudmailin

import (
"bytes"
"encoding/json"
"io"
"io/ioutil"
)

// A SPF (Sender Policy Framework) result for the given IP address and Domain.
Expand Down Expand Up @@ -38,6 +40,12 @@ type Headers struct {
DkimSignature string `json:"dkim_signature"`
}

// Headers contains all of the message headers extracted from the email.
type HeadersStringReceived struct {
Received string `json:"received"`
Headers
}

// Attachments to the message
type Attachments struct {
Content string `json:"content"`
Expand All @@ -58,11 +66,43 @@ type Data struct {
Attachments []Attachments `json:"attachments"`
}

type DataHeadersStringReceived struct {
Headers HeadersStringReceived `json:"headers"`
Data
}

// Decode a message into a Data struct
func Decode(r io.Reader) (Data, error) {
var ret Data
var tmp DataHeadersStringReceived

body, _ := ioutil.ReadAll(r)

reader1 := bytes.NewReader(body)
reader2 := bytes.NewReader(body)

err := json.NewDecoder(reader1).Decode(&ret)
if err != nil {
tmpErr := json.NewDecoder(reader2).Decode(&tmp)
if tmpErr != nil {
return ret, tmpErr
}

ret.Headers.Received = []string{tmp.Headers.Received}
ret.Headers.Date = tmp.Headers.Date
ret.Headers.From = tmp.Headers.From
ret.Headers.To = tmp.Headers.To
ret.Headers.MessageID = tmp.Headers.MessageID
ret.Headers.Subject = tmp.Headers.Subject
ret.Headers.MimeVersion = tmp.Headers.MimeVersion
ret.Headers.ContentType = tmp.Headers.ContentType
ret.Headers.ContentTransferEncoding = tmp.Headers.ContentTransferEncoding
ret.Headers.XOriginatingIP = tmp.Headers.XOriginatingIP
ret.Headers.XDomainSigner = tmp.Headers.XDomainSigner
ret.Headers.DkimSignature = tmp.Headers.DkimSignature

err := json.NewDecoder(r).Decode(&ret)
return ret, nil
}

return ret, err
}
36 changes: 36 additions & 0 deletions cloudmailin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,3 +76,39 @@ func TestDecodeCloudmailin(t *testing.T) {
}
}
}

func TestDecodeCloudmailin2(t *testing.T) {
tests := []struct {
Fn, To, From, Bcc, Subject string
}{
{
Fn: "testdata/cloudmailin_string_headers_received.json",
To: "12345678+makkara2@cloudmailin.net",
From: "Hermanni Hiiri <Hermanni.Hiiri@iki.fi>",
Bcc: "",
Subject: "asdfsdf",
},
}

for _, tt := range tests {
f, err := os.Open(tt.Fn)
defer f.Close()

d, err := Decode(f)
if err != nil {
t.Errorf("got unexpected error %v", err)
}

if d.Headers.To != tt.To {
t.Errorf("d.Headers.To = %v, want %v", d.Headers.To, tt.To)
}

if d.Headers.From != tt.From {
t.Errorf("d.Headers.From = %v, want %v", d.Headers.From, tt.From)
}

if d.Headers.Subject != tt.Subject {
t.Errorf("d.Headers.Subject = %v, want %v", d.Headers.Subject, tt.Subject)
}
}
}
36 changes: 36 additions & 0 deletions testdata/cloudmailin_string_headers_received.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"headers": {
"received": "by mail-pj1-f48.google.com with SMTP id gq23-20020a17090b1057b0290151869af68bso4809999pjb.4 for <12345678+makkara2@cloudmailin.net>; Mon, 26 Apr 2021 02:24:52 -0700",
"date": "Mon, 26 Apr 2021 12:17:53 +0300",
"from": "Hermanni Hiiri <Hermanni.Hiiri@iki.fi>",
"to": "12345678+makkara2@cloudmailin.net",
"message_id": "<CABE=HBn=ua1jSYBv+2wmjCwE8UWmY1HSretQ3bK+7EPuBbnLwQ@mail.gmail.com>",
"subject": "asdfsdf",
"mime_version": "1.0",
"content_type": "multipart/alternative; boundary=0000000000005fe81e05c0dca0c1",
"x_google_dkim_signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=BFVkIm9mAAzeg7P9BWXWH8cktg8aDX7gUsSgOU9fggE=; b=SPUWCuuHapOUogawA8uxchlaKcr9PXvFzl7SQNegIaZbm/wiPsnNIPWOCniV1f3GVb X7lM0Z/CsgRrapsoNlJSfSK7azLJWeghyy8PDYSdJzI5snCf66m1KiX31lmAe+Sf48Fh MjcQx6Bpu59AH6k6M5GvrNSwrbb3ZkrXtABGGWP00yqGWIS3w74uDDdGaSU3GNL0p3q7 KEgut3iEiOyzjiq1SG6tmqLlKk+pnLeY9A0kOXbxcHmhaWFDeqTlQYCI0JBpMuuHBPbE iXA5UztYq7d1ag2AyB6KlScIMfLwSowS3qo3VfdcPw6+dwxMLfBui+aDrCRTUaQ/d9vF 7c8A==",
"x_gm_message_state": "AOAM533VZvxGFE+II85oPnUiwjS5bqqrTYmGFwTOTzlcAgcIVaXEooZD\tUhQR5kxOGWA71shcOtpCqMLabaaRd1hGMHl7Yi3M1QCc+tU=",
"x_google_smtp_source": "ABdhPJwmC8PQ+6nLjPtUWElq6JP5uuyLhvcW3wAgw63p132R6EMg77/swr5OwPyokGKkgS4vTprkDRscVQ+XOiomjf4=",
"x_received": "by 2002:aa7:9f8f:0:b029:274:21e:fe0c with SMTP id z15-20020aa79f8f0000b0290274021efe0cmr8112859pfr.8.1619428699530; Mon, 26 Apr 2021 02:18:19 -0700 (PDT)"
},
"envelope": {
"to": "12345678+makkara2@cloudmailin.net",
"recipients": [
"12345678+makkara2@cloudmailin.net"
],
"from": "Hermanni.Hiiri@gmail.com",
"helo_domain": "mail-pj1-f48.google.com",
"remote_ip": "209.85.216.48",
"tls": true,
"tls_cipher": "TLSv1.3",
"md5": "80ad58184cad900aeff52a92dc8203f1",
"spf": {
"result": "neutral",
"domain": "gmail.com"
}
},
"plain": "12345678+makkara2@cloudmailin.net\n",
"html": "<div dir=\"ltr\"><div dir=\"ltr\"><a href=\"mailto:12345678%2Bmakkara2@cloudmailin.net\">12345678+makkara2@cloudmailin.net</a><br></div></div>\n",
"reply_plain": null,
"attachments": []
}