Skip to content

Commit ce19c7d

Browse files
committed
moved from multipart-formdata to json, as well any attachment as base64
1 parent 15c54ed commit ce19c7d

File tree

3 files changed

+119
-31
lines changed

3 files changed

+119
-31
lines changed

helper.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,18 @@ func extractEmails(addr []*mail.Address, _ ...error) []string {
1313

1414
return ret
1515
}
16+
17+
func transformStdAddressToEmailAddress(addr []*mail.Address) []*EmailAddress {
18+
ret := []*EmailAddress{}
19+
20+
for _, e := range addr {
21+
ret = append(ret, &EmailAddress{
22+
Address: e.Address,
23+
Name: e.Name,
24+
})
25+
}
26+
27+
return ret
28+
}
29+
30+
// func smtpsrvMesssage2EmailMessage(msg *smtpsrv.Context)

main.go

Lines changed: 48 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package main
22

33
import (
4+
"encoding/base64"
45
"errors"
56
"fmt"
6-
"strconv"
7-
"strings"
7+
"io/ioutil"
8+
"log"
89

910
"github.com/alash3al/go-smtpsrv/v3"
1011
"github.com/go-resty/resty/v2"
@@ -23,44 +24,60 @@ func main() {
2324

2425
spfResult, _, _ := c.SPF()
2526

26-
req := resty.New().R()
27+
jsonData := EmailMessage{
28+
ID: msg.MessageID,
29+
Date: msg.Date.String(),
30+
References: msg.References,
31+
SPFResult: spfResult.String(),
32+
ResentDate: msg.ResentDate.String(),
33+
ResentID: msg.ResentMessageID,
34+
Subject: msg.Subject,
35+
Attachments: []*EmailAttachment{},
36+
EmbeddedFiles: []*EmailEmbeddedFile{},
37+
}
38+
39+
jsonData.Body.HTML = string(msg.HTMLBody)
40+
jsonData.Body.Text = string(msg.TextBody)
41+
42+
jsonData.Addresses.From = transformStdAddressToEmailAddress(msg.From)[0]
43+
jsonData.Addresses.To = transformStdAddressToEmailAddress(msg.To)
44+
jsonData.Addresses.Cc = transformStdAddressToEmailAddress(msg.Cc)
45+
jsonData.Addresses.Bcc = transformStdAddressToEmailAddress(msg.Bcc)
46+
jsonData.Addresses.ReplyTo = transformStdAddressToEmailAddress(msg.ReplyTo)
47+
jsonData.Addresses.InReplyTo = msg.InReplyTo
2748

28-
formData := map[string]string{
29-
"id": msg.MessageID,
30-
"date": msg.Date.String(),
31-
"subject": msg.Subject,
32-
"body[text]": string(msg.TextBody),
33-
"body[html]": string(msg.HTMLBody),
34-
"addresses[from]": c.From().Address,
35-
"addresses[to]": strings.Join(extractEmails(msg.To), ","),
36-
"addresses[reply-to]": strings.Join(extractEmails(msg.ReplyTo), ","),
37-
"addresses[resent-to]": strings.Join(extractEmails(msg.ResentTo), ","),
38-
"addresses[resent-cc]": strings.Join(extractEmails(msg.ResentCc), ","),
39-
"addresses[resent-bcc]": strings.Join(extractEmails(msg.ResentBcc), ","),
40-
"addresses[resent-from]": strings.Join(extractEmails(msg.ResentFrom), ","),
41-
"addresses[in-reply-to]": strings.Join(msg.InReplyTo, ","),
42-
"addresses[cc]": strings.Join(extractEmails(msg.Cc), ","),
43-
"addresses[bcc]": strings.Join(extractEmails(msg.Bcc), ","),
44-
"resent-date": msg.ResentDate.String(),
45-
"resent-id": msg.ResentMessageID,
46-
"references": strings.Join(msg.References, "m"),
47-
"spf_result": strings.ToLower(spfResult.String()),
49+
if resentFrom := transformStdAddressToEmailAddress(msg.ResentFrom); len(resentFrom) > 0 {
50+
jsonData.Addresses.ResentFrom = resentFrom[0]
4851
}
4952

50-
// set the url-encoded-data
51-
req.SetFormData(formData)
53+
jsonData.Addresses.ResentTo = transformStdAddressToEmailAddress(msg.ResentTo)
54+
jsonData.Addresses.ResentCc = transformStdAddressToEmailAddress(msg.ResentCc)
55+
jsonData.Addresses.ResentBcc = transformStdAddressToEmailAddress(msg.ResentBcc)
56+
57+
for _, a := range msg.Attachments {
58+
data, _ := ioutil.ReadAll(a.Data)
59+
jsonData.Attachments = append(jsonData.Attachments, &EmailAttachment{
60+
Filename: a.Filename,
61+
ContentType: a.ContentType,
62+
Data: base64.StdEncoding.EncodeToString(data),
63+
})
64+
}
5265

53-
// set the files "attachments"
54-
for i, file := range msg.Attachments {
55-
iStr := strconv.Itoa(i)
56-
req.SetFileReader("file["+iStr+"]", file.Filename, (file.Data))
66+
for _, a := range msg.EmbeddedFiles {
67+
data, _ := ioutil.ReadAll(a.Data)
68+
jsonData.EmbeddedFiles = append(jsonData.EmbeddedFiles, &EmailEmbeddedFile{
69+
CID: a.CID,
70+
ContentType: a.ContentType,
71+
Data: base64.StdEncoding.EncodeToString(data),
72+
})
5773
}
5874

59-
// submit the form
60-
resp, err := req.Post(*flagWebhook)
75+
resp, err := resty.New().R().SetHeader("Content-Type", "application/json").SetBody(jsonData).Post(*flagWebhook)
6176
if err != nil {
77+
log.Println(err)
6278
return errors.New("E1: Cannot accept your message due to internal error, please report that to our engineers")
6379
} else if resp.StatusCode() != 200 {
80+
log.Println(resp.Status())
6481
return errors.New("E2: Cannot accept your message due to internal error, please report that to our engineers")
6582
}
6683

message.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package main
2+
3+
// EmailAddress ...
4+
type EmailAddress struct {
5+
Name string `json:"name,omitempty"`
6+
Address string `json:"address,omitempty"`
7+
}
8+
9+
// EmailAttachment ...
10+
type EmailAttachment struct {
11+
Filename string `json:"filename"`
12+
ContentType string `json:"content_type"`
13+
Data string `json:"data"`
14+
}
15+
16+
// EmailEmbeddedFile ...
17+
type EmailEmbeddedFile struct {
18+
CID string `json:"cid"`
19+
ContentType string `json:"content_type"`
20+
Data string `json:"data"`
21+
}
22+
23+
// EmailMessage ...
24+
type EmailMessage struct {
25+
References []string `json:"references,omitempty"`
26+
SPFResult string `json:"spf,omitempty"`
27+
28+
ID string `json:"id,omitempty"`
29+
Date string `json:"date,omitempty"`
30+
Subject string `json:"subject,omitempty"`
31+
32+
ResentDate string `json:"resent_date,omitempty"`
33+
ResentID string `json:"resent_id,omitempty"`
34+
35+
Body struct {
36+
Text string `json:"text,omitempty"`
37+
HTML string `json:"html,omitempty"`
38+
} `json:"body"`
39+
40+
Addresses struct {
41+
From *EmailAddress `json:"from"`
42+
To []*EmailAddress `json:"to"`
43+
ReplyTo []*EmailAddress `json:"reply_to,omitempty"`
44+
Cc []*EmailAddress `json:"cc,omitempty"`
45+
Bcc []*EmailAddress `json:"bcc,omitempty"`
46+
InReplyTo []string `json:"in_reply_to,omitempty"`
47+
48+
ResentFrom *EmailAddress `json:"resent_from,omitempty"`
49+
ResentTo []*EmailAddress `json:"resent_to,omitempty"`
50+
ResentCc []*EmailAddress `json:"resent_cc,omitempty"`
51+
ResentBcc []*EmailAddress `json:"resent_bcc,omitempty"`
52+
} `json:"addresses"`
53+
54+
Attachments []*EmailAttachment `json:"attachments,omitempty"`
55+
EmbeddedFiles []*EmailEmbeddedFile `json:"embedded_files,omitempty"`
56+
}

0 commit comments

Comments
 (0)