diff --git a/app/controllers/app.go b/app/controllers/app.go index 47b5739..185632f 100644 --- a/app/controllers/app.go +++ b/app/controllers/app.go @@ -1,6 +1,9 @@ package controllers -import "github.com/robfig/revel" +import ( + "github.com/jhillyerd/inbucket/app/smtpd" + "github.com/robfig/revel" +) type Application struct { *rev.Controller @@ -9,3 +12,20 @@ type Application struct { func (c Application) Index() rev.Result { return c.Render() } + +type SmtpdPlugin struct { + rev.EmptyPlugin + server *smtpd.Server +} + +func (p SmtpdPlugin) OnAppStart() { + domain := rev.Config.StringDefault("smtpd.domain", "localhost") + port := rev.Config.IntDefault("smtpd.port", 2500) + rev.INFO.Printf("SMTP Daemon plugin init {domain: %v, port: %v}", domain, port) + p.server = smtpd.New(domain, port) + go p.server.Start() +} + +func init() { + rev.RegisterPlugin(SmtpdPlugin{}) +} diff --git a/app/smtpd/handler.go b/app/smtpd/handler.go index 170e26e..f8fedbe 100644 --- a/app/smtpd/handler.go +++ b/app/smtpd/handler.go @@ -56,6 +56,7 @@ type Session struct { server *Server id int conn net.Conn + remoteHost string sendError error state State reader *bufio.Reader @@ -65,7 +66,8 @@ type Session struct { func NewSession(server *Server, id int, conn net.Conn) *Session { reader := bufio.NewReader(conn) - return &Session{server: server, id: id, conn: conn, state: GREET, reader: reader} + host, _, _ := net.SplitHostPort(conn.RemoteAddr().String()) + return &Session{server: server, id: id, conn: conn, state: GREET, reader: reader, remoteHost: host} } func (ss *Session) String() string { @@ -80,7 +82,7 @@ func (ss *Session) String() string { * 5. Goto 2 */ func (s *Server) startSession(id int, conn net.Conn) { - s.trace("Starting session <%v>", id) + s.info("Connection from %v, starting session <%v>", conn.RemoteAddr(), id) defer conn.Close() ss := NewSession(s, id, conn) @@ -343,17 +345,17 @@ func (ss *Session) ooSeq(cmd string) { // Session specific logging methods func (ss *Session) trace(msg string, args ...interface{}) { - ss.server.trace("<%v> %v", ss.id, fmt.Sprintf(msg, args...)) + ss.server.trace("%v<%v> %v", ss.remoteHost, ss.id, fmt.Sprintf(msg, args...)) } func (ss *Session) info(msg string, args ...interface{}) { - ss.server.info("<%v> %v", ss.id, fmt.Sprintf(msg, args...)) + ss.server.info("%v<%v> %v", ss.remoteHost, ss.id, fmt.Sprintf(msg, args...)) } func (ss *Session) warn(msg string, args ...interface{}) { - ss.server.warn("<%v> %v", ss.id, fmt.Sprintf(msg, args...)) + ss.server.warn("%v<%v> %v", ss.remoteHost, ss.id, fmt.Sprintf(msg, args...)) } func (ss *Session) error(msg string, args ...interface{}) { - ss.server.error("<%v> %v", ss.id, fmt.Sprintf(msg, args...)) + ss.server.error("%v<%v> %v", ss.remoteHost, ss.id, fmt.Sprintf(msg, args...)) } diff --git a/app/smtpd/listener.go b/app/smtpd/listener.go index 7a56260..9c309ba 100644 --- a/app/smtpd/listener.go +++ b/app/smtpd/listener.go @@ -3,6 +3,7 @@ package smtpd import ( "fmt" "net" + "github.com/robfig/revel" ) // Real server code starts here @@ -15,24 +16,24 @@ type Server struct { // Init a new Server object func New(domain string, port int) *Server { - return &Server{domain: domain, port: port, maxRecips: 3, maxIdleSeconds: 10} + return &Server{domain: domain, port: port, maxRecips: 100, maxIdleSeconds: 60} } // Loggers func (s *Server) trace(msg string, args ...interface{}) { - fmt.Printf("[trace] %s\n", fmt.Sprintf(msg, args...)) + rev.TRACE.Printf(msg, args...) } func (s *Server) info(msg string, args ...interface{}) { - fmt.Printf("[info ] %s\n", fmt.Sprintf(msg, args...)) + rev.INFO.Printf(msg, args...) } func (s *Server) warn(msg string, args ...interface{}) { - fmt.Printf("[warn ] %s\n", fmt.Sprintf(msg, args...)) + rev.WARN.Printf(msg, args...) } func (s *Server) error(msg string, args ...interface{}) { - fmt.Printf("[error] %s\n", fmt.Sprintf(msg, args...)) + rev.ERROR.Printf(msg, args...) } // Main listener loop diff --git a/conf/app.conf b/conf/app.conf index e3d3466..2b45c7f 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -6,6 +6,8 @@ http.port=9000 [dev] results.pretty=true server.watcher=true +smtpd.domain=skynet +smtpd.port=2500 log.trace.output = off log.info.output = stderr @@ -15,6 +17,8 @@ log.error.output = stderr [prod] results.pretty=false server.watcher=false +smtpd.domain=skynet +smtpd.port=2500 log.trace.output = off log.info.output = off