diff --git a/cmd/root.go b/cmd/root.go index ca210f7..1472c39 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -331,6 +331,7 @@ func initConfigFromEnv() { config.SMTPRelayConfig.OverrideFrom = os.Getenv("MP_SMTP_RELAY_OVERRIDE_FROM") config.SMTPRelayConfig.AllowedRecipients = os.Getenv("MP_SMTP_RELAY_ALLOWED_RECIPIENTS") config.SMTPRelayConfig.BlockedRecipients = os.Getenv("MP_SMTP_RELAY_BLOCKED_RECIPIENTS") + config.SMTPRelayConfig.PreserveMessageIDs = getEnabledFromEnv("MP_SMTP_RELAY_PRESERVE_MESSAGE_IDS") // SMTP forwarding config.SMTPForwardConfigFile = os.Getenv("MP_SMTP_FORWARD_CONFIG") diff --git a/config/config.go b/config/config.go index 8a6b770..3882e78 100644 --- a/config/config.go +++ b/config/config.go @@ -237,6 +237,7 @@ type SMTPRelayConfigStruct struct { AllowedRecipientsRegexp *regexp.Regexp // compiled regexp using AllowedRecipients BlockedRecipients string `yaml:"blocked-recipients"` // regex, if set prevents relating to these addresses BlockedRecipientsRegexp *regexp.Regexp // compiled regexp using BlockedRecipients + PreserveMessageIDs bool `yaml:"preserve-message-ids"` // preserve the original Message-ID when relaying // DEPRECATED 2024/03/12 RecipientAllowlist string `yaml:"recipient-allowlist"` diff --git a/server/apiv1/application.go b/server/apiv1/application.go index 4ec741d..5e8bad8 100644 --- a/server/apiv1/application.go +++ b/server/apiv1/application.go @@ -62,6 +62,9 @@ type webUIConfiguration struct { BlockedRecipients string // Overrides the "From" address for all relayed messages OverrideFrom string + // Preserve the original Message-IDs when relaying messages + PreserveMessageIDs bool + // DEPRECATED 2024/03/12 // swagger:ignore RecipientAllowlist string @@ -117,6 +120,8 @@ func WebUIConfig(w http.ResponseWriter, _ *http.Request) { conf.MessageRelay.AllowedRecipients = config.SMTPRelayConfig.AllowedRecipients conf.MessageRelay.BlockedRecipients = config.SMTPRelayConfig.BlockedRecipients conf.MessageRelay.OverrideFrom = config.SMTPRelayConfig.OverrideFrom + conf.MessageRelay.PreserveMessageIDs = config.SMTPRelayConfig.PreserveMessageIDs + // DEPRECATED 2024/03/12 conf.MessageRelay.RecipientAllowlist = config.SMTPRelayConfig.AllowedRecipients } diff --git a/server/apiv1/release.go b/server/apiv1/release.go index 3615d6c..bc7eeb8 100644 --- a/server/apiv1/release.go +++ b/server/apiv1/release.go @@ -176,13 +176,14 @@ func ReleaseMessage(w http.ResponseWriter, r *http.Request) { return } - // generate unique ID - uid := shortuuid.New() + "@mailpit" - // update Message-ID with unique ID - msg, err = tools.SetMessageHeader(msg, "Message-ID", "<"+uid+">") - if err != nil { - httpError(w, err.Error()) - return + if !config.SMTPRelayConfig.PreserveMessageIDs { + // replace the Message-ID header with unique ID + uid := shortuuid.New() + "@mailpit" + msg, err = tools.SetMessageHeader(msg, "Message-ID", "<"+uid+">") + if err != nil { + httpError(w, err.Error()) + return + } } if err := smtpd.Relay(from, data.To, msg); err != nil { diff --git a/server/ui-src/components/message/Release.vue b/server/ui-src/components/message/Release.vue index 45622f9..66ee28a 100644 --- a/server/ui-src/components/message/Release.vue +++ b/server/ui-src/components/message/Release.vue @@ -140,8 +140,8 @@ export default { will be rejected: {{ mailbox.uiConfig.MessageRelay.BlockedRecipients }} -
  • - For testing purposes, a new unique Message-Id will be generated on send. +
  • + For testing purposes, a new unique Message-ID will be generated on send.
  • The From email address has been overridden by the relay configuration to diff --git a/server/ui/api/v1/swagger.json b/server/ui/api/v1/swagger.json index f033dd1..a440147 100644 --- a/server/ui/api/v1/swagger.json +++ b/server/ui/api/v1/swagger.json @@ -2016,6 +2016,10 @@ "description": "Overrides the \"From\" address for all relayed messages", "type": "string" }, + "PreserveMessageIDs": { + "description": "Preserve the original Message-IDs when relaying messages", + "type": "boolean" + }, "ReturnPath": { "description": "Enforced Return-Path (if set) for relay bounces", "type": "string"