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 }}
-
Message-Id
will be generated on send.
+ Message-ID
will be generated on send.
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"