-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathmain.go
95 lines (80 loc) · 1.88 KB
/
main.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
package main
import (
"flag"
"log"
"sync"
"github.com/mailhog/MailHog-MDA/config"
sconfig "github.com/mailhog/backends/config"
"github.com/mailhog/backends/delivery"
"github.com/mailhog/backends/mailbox"
"github.com/mailhog/backends/resolver"
)
var deliveryService delivery.Service
var mailboxService mailbox.Service
var resolverService resolver.Service
var conf *config.Config
var wg sync.WaitGroup
func configure() {
config.RegisterFlags()
flag.Parse()
conf = config.Configure()
configureBackends()
}
func main() {
configure()
deliveries := make(chan *delivery.Message, 100)
deliveryService.Deliveries(deliveries)
for m := range deliveries {
log.Printf("Received: %+v", m)
/*
TODO
- split message (group by server etc)
- deliver local messages
- deliver remote messages (or queue for external delivery?)
*/
for _, t := range m.To {
mbox, err := mailboxService.Open(t)
if err != nil {
log.Printf("Error opening mailbox %s: %s", t, err)
continue
}
err = mbox.Store(*m)
if err != nil {
log.Printf("Error storing message for %s: %s", t, err)
}
}
err := deliveryService.Delivered(*m, true)
if err != nil {
log.Printf("Error: %+v", m)
}
}
}
func configureBackends() error {
var d, m, r sconfig.BackendConfig
var err error
if conf.Delivery != nil {
log.Printf("got delivery config")
d, err = conf.Delivery.Resolve(conf.Backends)
if err != nil {
return err
}
}
if conf.Mailbox != nil {
log.Printf("got mailbox config")
m, err = conf.Mailbox.Resolve(conf.Backends)
if err != nil {
return err
}
}
if conf.Resolver != nil {
log.Printf("got resolver config")
r, err = conf.Resolver.Resolve(conf.Backends)
if err != nil {
return err
}
}
deliveryService = delivery.Load(d, *conf)
resolverService = resolver.Load(r, *conf)
mailboxService = mailbox.Load(m, *conf, resolverService)
return nil
}