forked from alexanderlovell/mailer
-
Notifications
You must be signed in to change notification settings - Fork 2
/
main.go
76 lines (62 loc) · 1.74 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
// Command dkim-proxy implements a simple SMTP proxy that DKIM signs incoming e-mail and relays to another SMTP server for delivery
package main
import (
"bytes"
"flag"
"io/ioutil"
"log"
"net/smtp"
"bitbucket.org/chrj/smtpd"
"github.com/eaigner/dkim"
)
var (
welcomeMsg = flag.String("welcome", "DKIM-proxy ESMTP ready.", "Welcome message for SMTP session")
inAddr = flag.String("inaddr", "localhost:10025", "Address to listen for incoming SMTP on")
outAddr = flag.String("outaddr", "localhost:25", "Address to deliver outgoing SMTP on")
privKeyFile = flag.String("key", "", "Private key file.")
dkimS = flag.String("s", "default", "DKIM selector")
dkimD = flag.String("d", "", "DKIM domain")
dkimConf dkim.Conf
privKey []byte
)
func handler(peer smtpd.Peer, env smtpd.Envelope) error {
d, err := dkim.New(dkimConf, privKey)
if err != nil {
log.Printf("DKIM error: %v", err)
return smtpd.ErrMessageError
}
// The dkim package expects \r\n newlines, so replace to that
data, err := d.Sign(bytes.Replace(env.Data, []byte("\n"), []byte("\r\n"), -1))
if err != nil {
log.Printf("DKIM signing error: %v", err)
return smtpd.ErrMessageError
}
return smtp.SendMail(
*outAddr,
nil,
env.Sender,
env.Recipients,
data,
)
}
func main() {
flag.Parse()
var err error
dkimConf, err = dkim.NewConf(*dkimD, *dkimS)
if err != nil {
log.Fatalf("DKIM configuration error: %v", err)
}
privKey, err = ioutil.ReadFile(*privKeyFile)
if err != nil {
log.Fatalf("Couldn't read private key: %v", err)
}
_, err = dkim.New(dkimConf, privKey)
if err != nil {
log.Fatalf("DKIM error: %v", err)
}
server := &smtpd.Server{
WelcomeMessage: *welcomeMsg,
Handler: handler,
}
server.ListenAndServe(*inAddr)
}