51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package backendutil
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/emersion/go-imap"
|
|
"github.com/emersion/go-message"
|
|
"github.com/emersion/go-message/mail"
|
|
)
|
|
|
|
func headerAddressList(h mail.Header, key string) ([]*imap.Address, error) {
|
|
addrs, err := h.AddressList(key)
|
|
|
|
list := make([]*imap.Address, len(addrs))
|
|
for i, a := range addrs {
|
|
parts := strings.SplitN(a.Address, "@", 2)
|
|
mailbox := parts[0]
|
|
var hostname string
|
|
if len(parts) == 2 {
|
|
hostname = parts[1]
|
|
}
|
|
|
|
list[i] = &imap.Address{
|
|
PersonalName: a.Name,
|
|
MailboxName: mailbox,
|
|
HostName: hostname,
|
|
}
|
|
}
|
|
|
|
return list, err
|
|
}
|
|
|
|
// FetchEnvelope returns a message's envelope from its header.
|
|
func FetchEnvelope(h message.Header) (*imap.Envelope, error) {
|
|
mh := mail.Header{h}
|
|
|
|
env := new(imap.Envelope)
|
|
env.Date, _ = mh.Date()
|
|
env.Subject, _ = mh.Subject()
|
|
env.From, _ = headerAddressList(mh, "From")
|
|
env.Sender, _ = headerAddressList(mh, "Sender")
|
|
env.ReplyTo, _ = headerAddressList(mh, "Reply-To")
|
|
env.To, _ = headerAddressList(mh, "To")
|
|
env.Cc, _ = headerAddressList(mh, "Cc")
|
|
env.Bcc, _ = headerAddressList(mh, "Bcc")
|
|
env.InReplyTo = mh.Get("In-Reply-To")
|
|
env.MessageId = mh.Get("Message-Id")
|
|
|
|
return env, nil
|
|
}
|