// Start initiates a new SMTP server given an Enqueuer and a configuration. func Start(mq mailbox.Enqueuer, cfg jamon.Group) error { if !cfg.Has("listen") || !cfg.Has("host") { return ErrMinConfig } ln, err := net.Listen("tcp", cfg.Get("listen")) if err != nil { return err } srv := server{Enqueuer: mq, config: cfg} srv.spec = commandSpec{ "HELO": cmdHELO, "EHLO": cmdEHLO, "MAIL": cmdMAIL, "RCPT": cmdRCPT, "DATA": cmdDATA, "RSET": cmdRSET, "NOOP": cmdNOOP, "VRFY": cmdVRFY, "QUIT": cmdQUIT, } for { conn, err := ln.Accept() if err != nil { log.Printf("Error accepting an incoming connection: %s\r\n", err) continue } go srv.createTransaction(conn) } }