From 8207d5493329636a3814a90682a800c015d33765 Mon Sep 17 00:00:00 2001 From: smail Date: Sun, 30 Aug 2026 23:53:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=A5=E5=85=A5=E9=82=AE=E4=BB=B6=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=9B=91=E5=90=AC=E7=AB=AF=E5=8F=A3=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=BF=AB=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/config/runtime_access.go | 27 ++++++++++++++++++++++++ server/listen/imap_server/imap_server.go | 5 +++-- server/listen/pop3_server/pop3server.go | 5 +++-- server/listen/smtp_server/smtp.go | 2 +- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/server/config/runtime_access.go b/server/config/runtime_access.go index 933864a..f0eee5e 100644 --- a/server/config/runtime_access.go +++ b/server/config/runtime_access.go @@ -118,6 +118,33 @@ func cloneConfig(source *Config) *Config { return &clone } +type MailPorts struct { + SMTP int + IMAP int + POP3 int +} + +func CurrentMailPorts() MailPorts { + ports := MailPorts{SMTP: 25, IMAP: 143, POP3: 110} + manager := CurrentManager() + if manager == nil { + return ports + } + runtime := manager.Snapshot() + if runtime.Generation == 0 { + return ports + } + if runtime.Email.Policy.SMTPPort > 0 && runtime.Email.Policy.SMTPPort <= 65535 { + ports.SMTP = runtime.Email.Policy.SMTPPort + } + if runtime.Email.Policy.IMAPPort > 0 && runtime.Email.Policy.IMAPPort <= 65535 { + ports.IMAP = runtime.Email.Policy.IMAPPort + } + if runtime.Email.Policy.POP3Port > 0 && runtime.Email.Policy.POP3Port <= 65535 { + ports.POP3 = runtime.Email.Policy.POP3Port + } + return ports +} func cloneHTTPConfig(source HTTPConfig) HTTPConfig { clone := source clone.TrustedProxyCIDRs = append([]string(nil), source.TrustedProxyCIDRs...) diff --git a/server/listen/imap_server/imap_server.go b/server/listen/imap_server/imap_server.go index 2ef9040..f2868b4 100644 --- a/server/listen/imap_server/imap_server.go +++ b/server/listen/imap_server/imap_server.go @@ -27,8 +27,9 @@ func StarTLS() error { return err } instanceTLS = server - log.Infof("IMAP With TLS Server Start On Port :993") - if err := instanceTLS.ListenAndServeTLS(":993"); err != nil { + port := config.CurrentMailPorts().IMAP + log.Infof("IMAP With TLS Server Start On Port :%d", port) + if err := instanceTLS.ListenAndServeTLS(fmt.Sprintf(":%d", port)); err != nil { return fmt.Errorf("serve IMAP TLS: %w", err) } return nil diff --git a/server/listen/pop3_server/pop3server.go b/server/listen/pop3_server/pop3server.go index 1240d16..3ca34c3 100644 --- a/server/listen/pop3_server/pop3server.go +++ b/server/listen/pop3_server/pop3server.go @@ -51,9 +51,10 @@ func Start() error { tlsConfig.Certificates = []tls.Certificate{crt} tlsConfig.Time = time.Now tlsConfig.Rand = rand.Reader - instance = gopop.NewPop3Server(110, "pop."+cfg.Domain, false, tlsConfig, action{}) + port := config.CurrentMailPorts().POP3 + instance = gopop.NewPop3Server(port, "pop."+cfg.Domain, false, tlsConfig, action{}) instance.ConnectAliveTime = 5 * time.Minute - log.Infof("POP3 Server Start On Port :110") + log.Infof("POP3 Server Start On Port :%d", port) err = instance.Start() if err != nil { diff --git a/server/listen/smtp_server/smtp.go b/server/listen/smtp_server/smtp.go index 433efa1..a1b1e65 100644 --- a/server/listen/smtp_server/smtp.go +++ b/server/listen/smtp_server/smtp.go @@ -95,7 +95,7 @@ func Start() error { instance = smtp.NewServer(be) - instance.Addr = ":25" + instance.Addr = fmt.Sprintf(":%d", config.CurrentMailPorts().SMTP) instance.Domain = cfg.Domain instance.ReadTimeout = 10 * time.Second instance.WriteTimeout = 10 * time.Second