Add support for outbound SMTP delivery.
[mailpopbox.git] / smtp / relay.go
1 // mailpopbox
2 // Copyright 2020 Blue Static <https://www.bluestatic.org>
3 // This program is free software licensed under the GNU General Public License,
4 // version 3.0. The full text of the license can be found in LICENSE.txt.
5 // SPDX-License-Identifier: GPL-3.0-only
6
7 package smtp
8
9 import (
10 "net"
11 "net/smtp"
12
13 "github.com/uber-go/zap"
14 )
15
16 func RelayMessage(env Envelope, log zap.Logger) {
17 for _, rcptTo := range env.RcptTo {
18 domain := DomainForAddress(rcptTo)
19 mx, err := net.LookupMX(domain)
20 if err != nil || len(mx) < 1 {
21 log.Error("failed to lookup MX records",
22 zap.String("address", rcptTo.Address),
23 zap.Error(err))
24 deliverRelayFailure(env, err)
25 return
26 }
27
28 to := []string{rcptTo.Address}
29 from := env.MailFrom.Address
30 host := mx[0].Host + ":25"
31
32 log.Info("relay message",
33 zap.String("to", to[0]),
34 zap.String("from", from),
35 zap.String("server", host))
36 err = smtp.SendMail(host, nil, from, to, env.Data)
37 if err != nil {
38 log.Error("failed to relay message",
39 zap.String("address", rcptTo.Address),
40 zap.Error(err))
41 deliverRelayFailure(env, err)
42 return
43 }
44 }
45 }
46
47 func deliverRelayFailure(env Envelope, err error) {
48 // TODO: constructo a delivery status notification
49 }