diff --git a/modules/setting/incoming_email.go b/modules/setting/incoming_email.go
index 75337a312f..f5ee1368f1 100644
--- a/modules/setting/incoming_email.go
+++ b/modules/setting/incoming_email.go
@@ -38,6 +38,15 @@ func loadIncomingEmailFrom(rootCfg ConfigProvider) {
 		return
 	}
 
+	// Handle aliases
+	sec := rootCfg.Section("email.incoming")
+	if sec.HasKey("USER") && !sec.HasKey("USERNAME") {
+		IncomingEmail.Username = sec.Key("USER").String()
+	}
+	if sec.HasKey("PASSWD") && !sec.HasKey("PASSWORD") {
+		IncomingEmail.Password = sec.Key("PASSWD").String()
+	}
+
 	if err := checkReplyToAddress(IncomingEmail.ReplyToAddress); err != nil {
 		log.Fatal("Invalid incoming_mail.REPLY_TO_ADDRESS (%s): %v", IncomingEmail.ReplyToAddress, err)
 	}
diff --git a/modules/setting/incoming_email_test.go b/modules/setting/incoming_email_test.go
new file mode 100644
index 0000000000..9e8ee0e6b7
--- /dev/null
+++ b/modules/setting/incoming_email_test.go
@@ -0,0 +1,24 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package setting
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func Test_loadIncomingEmailFrom(t *testing.T) {
+	cfg, _ := NewConfigProviderFromData("")
+	sec := cfg.Section("email.incoming")
+	sec.NewKey("ENABLED", "true")
+	sec.NewKey("USER", "jane.doe@example.com")
+	sec.NewKey("PASSWD", "y0u'll n3v3r gUess th1S!!1")
+	sec.NewKey("REPLY_TO_ADDRESS", "forge+%{token}@example.com")
+
+	loadIncomingEmailFrom(cfg)
+
+	assert.EqualValues(t, "jane.doe@example.com", IncomingEmail.Username)
+	assert.EqualValues(t, "y0u'll n3v3r gUess th1S!!1", IncomingEmail.Password)
+}
diff --git a/modules/setting/mailer.go b/modules/setting/mailer.go
index a2bc2df444..e9ce640c7f 100644
--- a/modules/setting/mailer.go
+++ b/modules/setting/mailer.go
@@ -134,6 +134,14 @@ func loadMailerFrom(rootCfg ConfigProvider) {
 		sec.Key("PROTOCOL").SetValue("smtp+starttls")
 	}
 
+	// Handle aliases
+	if sec.HasKey("USERNAME") && !sec.HasKey("USER") {
+		sec.Key("USER").SetValue(sec.Key("USERNAME").String())
+	}
+	if sec.HasKey("PASSWORD") && !sec.HasKey("PASSWD") {
+		sec.Key("PASSWD").SetValue(sec.Key("PASSWORD").String())
+	}
+
 	// Set default values & validate
 	sec.Key("NAME").MustString(AppName)
 	sec.Key("PROTOCOL").In("", []string{"smtp", "smtps", "smtp+starttls", "smtp+unix", "sendmail", "dummy"})
diff --git a/modules/setting/mailer_test.go b/modules/setting/mailer_test.go
index fbabf11378..f8af4a78c1 100644
--- a/modules/setting/mailer_test.go
+++ b/modules/setting/mailer_test.go
@@ -38,4 +38,17 @@ func Test_loadMailerFrom(t *testing.T) {
 			assert.EqualValues(t, kase.SMTPPort, MailService.SMTPPort)
 		})
 	}
+
+	t.Run("property aliases", func(t *testing.T) {
+		cfg, _ := NewConfigProviderFromData("")
+		sec := cfg.Section("mailer")
+		sec.NewKey("ENABLED", "true")
+		sec.NewKey("USERNAME", "jane.doe@example.com")
+		sec.NewKey("PASSWORD", "y0u'll n3v3r gUess th1S!!1")
+
+		loadMailerFrom(cfg)
+
+		assert.EqualValues(t, "jane.doe@example.com", MailService.User)
+		assert.EqualValues(t, "y0u'll n3v3r gUess th1S!!1", MailService.Passwd)
+	})
 }