// RootStatus serves the Inbucket status page func RootStatus(w http.ResponseWriter, req *http.Request, ctx *httpd.Context) (err error) { smtpListener := fmt.Sprintf("%s:%d", config.GetSMTPConfig().IP4address.String(), config.GetSMTPConfig().IP4port) pop3Listener := fmt.Sprintf("%s:%d", config.GetPOP3Config().IP4address.String(), config.GetPOP3Config().IP4port) webListener := fmt.Sprintf("%s:%d", config.GetWebConfig().IP4address.String(), config.GetWebConfig().IP4port) return httpd.RenderTemplate("root/status.html", w, map[string]interface{}{ "ctx": ctx, "version": config.Version, "buildDate": config.BuildDate, "smtpListener": smtpListener, "pop3Listener": pop3Listener, "webListener": webListener, "smtpConfig": config.GetSMTPConfig(), "dataStoreConfig": config.GetDataStoreConfig(), }) }
// Start the listener and handle incoming connections func (s *Server) Start() { cfg := config.GetSMTPConfig() addr, err := net.ResolveTCPAddr("tcp4", fmt.Sprintf("%v:%v", cfg.IP4address, cfg.IP4port)) if err != nil { log.Errorf("Failed to build tcp4 address: %v", err) // serve() never called, so we do local shutdown here close(s.localShutdown) s.emergencyShutdown() return } log.Infof("SMTP listening on TCP4 %v", addr) s.listener, err = net.ListenTCP("tcp4", addr) if err != nil { log.Errorf("SMTP failed to start tcp4 listener: %v", err) // serve() never called, so we do local shutdown here close(s.localShutdown) s.emergencyShutdown() return } if !s.storeMessages { log.Infof("Load test mode active, messages will not be stored") } else if s.domainNoStore != "" { log.Infof("Messages sent to domain '%v' will be discarded", s.domainNoStore) } // Start retention scanner StartRetentionScanner(s.dataStore, s.globalShutdown) // Listener go routine go s.serve() // Wait for shutdown select { case _ = <-s.globalShutdown: log.Tracef("SMTP shutdown requested, connections will be drained") } // Closing the listener will cause the serve() go routine to exit if err := s.listener.Close(); err != nil { log.Errorf("Failed to close SMTP listener: %v", err) } }