File: envelope.go

package info (click to toggle)
golang-github-emersion-go-imap 1.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 840 kB
  • sloc: makefile: 2
file content (58 lines) | stat: -rw-r--r-- 1,364 bytes parent folder | download | duplicates (3)
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
package backendutil

import (
	"net/mail"
	"strings"

	"github.com/emersion/go-imap"
	"github.com/emersion/go-message/textproto"
)

func headerAddressList(value string) ([]*imap.Address, error) {
	addrs, err := mail.ParseAddressList(value)
	if err != nil {
		return []*imap.Address{}, err
	}

	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 textproto.Header) (*imap.Envelope, error) {
	env := new(imap.Envelope)

	env.Date, _ = mail.ParseDate(h.Get("Date"))
	env.Subject = h.Get("Subject")
	env.From, _ = headerAddressList(h.Get("From"))
	env.Sender, _ = headerAddressList(h.Get("Sender"))
	if len(env.Sender) == 0 {
		env.Sender = env.From
	}
	env.ReplyTo, _ = headerAddressList(h.Get("Reply-To"))
	if len(env.ReplyTo) == 0 {
		env.ReplyTo = env.From
	}
	env.To, _ = headerAddressList(h.Get("To"))
	env.Cc, _ = headerAddressList(h.Get("Cc"))
	env.Bcc, _ = headerAddressList(h.Get("Bcc"))
	env.InReplyTo = h.Get("In-Reply-To")
	env.MessageId = h.Get("Message-Id")

	return env, nil
}