aboutsummaryrefslogtreecommitdiff
path: root/internal/feed/mail.go
blob: d166e09821ddbc2263d37916b856e179560226e7 (plain)
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
package feed

import (
	"bytes"
	"io"
	"time"

	"github.com/emersion/go-message/mail"

	"github.com/Necoro/feed2imap-go/internal/config"
)

func address(name, address string) []*mail.Address {
	return []*mail.Address{{name, address}}
}

func fromAdress(feed Feed, item feeditem, cfg config.Config) []*mail.Address {
	switch {
	case item.Item.Author != nil && item.Item.Author.Email != "":
		return address(item.Item.Author.Name, item.Item.Author.Email)
	case item.Item.Author != nil && item.Item.Author.Name != "":
		return address(item.Item.Author.Name, cfg.DefaultEmail)
	case item.Feed.Author != nil && item.Feed.Author.Email != "":
		return address(item.Feed.Author.Name, item.Feed.Author.Email)
	case item.Feed.Author != nil && item.Feed.Author.Name != "":
		return address(item.Feed.Author.Name, cfg.DefaultEmail)
	default:
		return address(feed.Name, cfg.DefaultEmail)
	}
}

func asMail(feed Feed, item feeditem, cfg config.Config) (string, error) {
	var b bytes.Buffer

	var h mail.Header
	h.SetAddressList("From", fromAdress(feed, item, cfg))
	h.SetAddressList("To", address(feed.Name, cfg.DefaultEmail))

	{ // date
		date := item.Item.PublishedParsed
		if date == nil {
			now := time.Now()
			date = &now
		}
		h.SetDate(*date)
	}
	{ // subject
		subject := item.Item.Title
		if subject == "" {
			subject = item.Item.Published
		}
		if subject == "" {
			subject = item.Item.Link
		}
		h.SetSubject(subject)
	}

	mw, err := mail.CreateWriter(&b, h)
	if err != nil {
		return "", err
	}

	if cfg.WithPartText() {
		tw, err := mw.CreateInline()
		if err != nil {
			return "", err
		}

		var th mail.InlineHeader
		th.SetContentType("text/plain", map[string]string{"charset": "utf-8", "format": "flowed"})

		w, err := tw.CreatePart(th)
		if err != nil {
			return "", err
		}
		_, _ = io.WriteString(w, "Who are you?")

		_ = w.Close()
		_ = tw.Close()
	}

	_ = mw.Close()

	return b.String(), nil
}