Define an smtp.Envelope that can be delivered to an smtp.Server.
[mailpopbox.git] / smtp.go
1 package main
2
3 import (
4 "crypto/tls"
5 "fmt"
6 "net"
7
8 "src.bluestatic.org/mailpopbox/smtp"
9 )
10
11 func runSMTPServer(config Config) <-chan error {
12 server := smtpServer{
13 config: config,
14 rc: make(chan error),
15 }
16 go server.run()
17 return server.rc
18 }
19
20 type smtpServer struct {
21 config Config
22 rc chan error
23 }
24
25 func (server *smtpServer) run() {
26 l, err := net.Listen("tcp", fmt.Sprintf(":%d", server.config.SMTPPort))
27 if err != nil {
28 server.rc <- err
29 return
30 }
31
32 for {
33 conn, err := l.Accept()
34 if err != nil {
35 server.rc <- err
36 return
37 }
38
39 go smtp.AcceptConnection(conn, server)
40 }
41 }
42
43 func (server *smtpServer) Name() string {
44 return server.config.Hostname
45 }
46
47 func (server *smtpServer) TLSConfig() *tls.Config {
48 return nil
49 }
50
51 func (server *smtpServer) OnEHLO() *smtp.ReplyLine {
52 return nil
53 }
54
55 func (server *smtpServer) OnMessageDelivered(en smtp.Envelope) *smtp.ReplyLine {
56 fmt.Printf("MSG: %#v\n%s\n", en, string(en.Data))
57 return nil
58 }