diff --git a/cmd/root.go b/cmd/root.go index 9552a96..e972a95 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -102,6 +102,7 @@ func init() { rootCmd.Flags().StringVar(&config.SMTPTLSKey, "smtp-tls-key", config.SMTPTLSKey, "TLS key for SMTP (STARTTLS) - requires smtp-tls-cert") rootCmd.Flags().BoolVar(&config.SMTPAuthAllowInsecure, "smtp-auth-allow-insecure", config.SMTPAuthAllowInsecure, "Enable insecure PLAIN & LOGIN authentication") rootCmd.Flags().BoolVar(&config.SMTPStrictRFCHeaders, "smtp-strict-rfc-headers", config.SMTPStrictRFCHeaders, "Return SMTP error if message headers contain ") + rootCmd.Flags().IntVar(&config.SMTPMaxRecipients, "smtp-max-recipients", config.SMTPMaxRecipients, "Maximum SMTP recipients allowed") rootCmd.Flags().StringVar(&config.SMTPRelayConfigFile, "smtp-relay-config", config.SMTPRelayConfigFile, "SMTP configuration file to allow releasing messages") rootCmd.Flags().BoolVar(&config.SMTPRelayAllIncoming, "smtp-relay-all", config.SMTPRelayAllIncoming, "Relay all incoming messages via external SMTP server (caution!)") @@ -166,6 +167,9 @@ func initConfigFromEnv() { if getEnabledFromEnv("MP_SMTP_STRICT_RFC_HEADERS") { config.SMTPStrictRFCHeaders = true } + if len(os.Getenv("MP_SMTP_MAX_RECIPIENTS")) > 0 { + config.SMTPMaxRecipients, _ = strconv.Atoi(os.Getenv("MP_SMTP_MAX_RECIPIENTS")) + } // Relay server config config.SMTPRelayConfigFile = os.Getenv("MP_SMTP_RELAY_CONFIG") diff --git a/config/config.go b/config/config.go index 97406a5..c8e7011 100644 --- a/config/config.go +++ b/config/config.go @@ -60,6 +60,11 @@ var ( // SMTPAuthAcceptAny accepts any username/password including none SMTPAuthAcceptAny bool + // SMTPMaxRecipients is the maximum number of recipients a message may have. + // The SMTP RFC states that an server must handle a minimum of 100 recipients + // however some servers accept more. + SMTPMaxRecipients = 100 + // IgnoreDuplicateIDs will skip messages with the same ID IgnoreDuplicateIDs bool diff --git a/go.mod b/go.mod index 29ff269..b806b8b 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/jhillyerd/enmime v1.0.1 github.com/klauspost/compress v1.17.4 github.com/leporo/sqlf v1.4.0 - github.com/mhale/smtpd v0.8.0 + github.com/mhale/smtpd v0.8.1 github.com/reiver/go-telnet v0.0.0-20180421082511-9ff0b2ab096e github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 diff --git a/go.sum b/go.sum index 8b080c0..e075938 100644 --- a/go.sum +++ b/go.sum @@ -90,8 +90,8 @@ github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mhale/smtpd v0.8.0 h1:5JvdsehCg33PQrZBvFyDMMUDQmvbzVpZgKob7eYBJc0= -github.com/mhale/smtpd v0.8.0/go.mod h1:MQl+y2hwIEQCXtNhe5+55n0GZOjSmeqORDIXbqUL3x4= +github.com/mhale/smtpd v0.8.1 h1:O02u8O3eYAGxZCGf4E98WjyB+rA3DVFZtchEialjX4s= +github.com/mhale/smtpd v0.8.1/go.mod h1:MQl+y2hwIEQCXtNhe5+55n0GZOjSmeqORDIXbqUL3x4= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= diff --git a/server/smtpd/smtpd.go b/server/smtpd/smtpd.go index 21b9a0d..2a37582 100644 --- a/server/smtpd/smtpd.go +++ b/server/smtpd/smtpd.go @@ -170,12 +170,13 @@ func Listen() error { func listenAndServe(addr string, handler smtpd.Handler, authHandler smtpd.AuthHandler) error { srv := &smtpd.Server{ - Addr: addr, - Handler: handler, - Appname: "Mailpit", - Hostname: "", - AuthHandler: nil, - AuthRequired: false, + Addr: addr, + Handler: handler, + Appname: "Mailpit", + Hostname: "", + AuthHandler: nil, + AuthRequired: false, + MaxRecipients: config.SMTPMaxRecipients, } if config.SMTPAuthAllowInsecure {