-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathenvelope.go
103 lines (91 loc) · 2.32 KB
/
envelope.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package imapsql
import (
"errors"
"net/mail"
"strings"
"time"
"github.com/emersion/go-imap"
)
type rawEnvelope struct {
Date time.Time
Subject string
From string
Sender string
ReplyTo string
To string
CC string
BCC string
InReplyTo string
MessageID string
}
func envelopeFromHeader(hdr map[string][]string) rawEnvelope {
enve := rawEnvelope{}
date := hdr["Date"]
if date != nil {
t, err := parseMessageDateTime(date[0])
if err == nil {
enve.Date = t
}
}
addrFields := [...]string{"From", "Sender", "Reply-To", "To", "Cc", "Bcc", "In-Reply-To"}
for i, fieldVar := range [...]*string{
&enve.From, &enve.Sender, &enve.ReplyTo,
&enve.To, &enve.CC, &enve.BCC, &enve.InReplyTo,
} {
val := hdr[addrFields[i]]
if val == nil {
continue
}
*fieldVar = strings.Join(val, ", ")
}
if enve.Sender == "" {
enve.Sender = enve.From
}
if enve.ReplyTo == "" {
enve.ReplyTo = enve.From
}
if val := hdr["Subject"]; val != nil {
enve.Subject = val[0]
}
if val := hdr["Message-Id"]; val != nil {
enve.MessageID = val[0]
}
return enve
}
func toImapAddr(list []*mail.Address) ([]*imap.Address, error) {
res := make([]*imap.Address, 0, len(list))
for _, mailAddr := range list {
imapAddr := imap.Address{}
imapAddr.PersonalName = mailAddr.Name
addrParts := strings.Split(mailAddr.Address, "@")
if len(addrParts) != 2 {
return res, errors.New("imap: malformed address")
}
imapAddr.MailboxName = addrParts[0]
imapAddr.HostName = addrParts[1]
res = append(res, &imapAddr)
}
return res, nil
}
func (enve *rawEnvelope) toIMAP() *imap.Envelope {
res := new(imap.Envelope)
res.Date = enve.Date
res.Subject = enve.Subject
from, _ := mail.ParseAddressList(enve.From)
res.From, _ = toImapAddr(from)
// I really wonder how we can have multiple senders in a message header,
// but imap.Envelope says we can.
sender, _ := mail.ParseAddressList(enve.Sender)
res.Sender, _ = toImapAddr(sender)
replyTo, _ := mail.ParseAddressList(enve.ReplyTo)
res.ReplyTo, _ = toImapAddr(replyTo)
to, _ := mail.ParseAddressList(enve.To)
res.To, _ = toImapAddr(to)
cc, _ := mail.ParseAddressList(enve.CC)
res.Cc, _ = toImapAddr(cc)
bcc, _ := mail.ParseAddressList(enve.BCC)
res.Bcc, _ = toImapAddr(bcc)
res.InReplyTo = enve.InReplyTo
res.MessageId = enve.MessageID
return res
}