diff --git a/js/apps/admin-ui/maven-resources/theme/keycloak.v2/admin/messages/messages_en.properties b/js/apps/admin-ui/maven-resources/theme/keycloak.v2/admin/messages/messages_en.properties
index 27704a63860..e4ab391ba57 100644
--- a/js/apps/admin-ui/maven-resources/theme/keycloak.v2/admin/messages/messages_en.properties
+++ b/js/apps/admin-ui/maven-resources/theme/keycloak.v2/admin/messages/messages_en.properties
@@ -3666,3 +3666,9 @@ claimDisplayLocalePlaceholder=e.g., en, de, fr
addClaimDisplay=Add display entry
removeClaimDisplay=Remove display entry
noClaimDisplayEntries=No display entries. Display entries provide user-friendly claim names for different locales in wallet applications.
+smtpConnectionTimeout=Connection timeout
+smtpConnectionTimeoutHelp=The timeout in milliseconds for connecting to the SMTP server.
+smtpSocketReadTimeout=Socket read timeout
+smtpSocketReadTimeoutHelp=The timeout in milliseconds for reading from the SMTP server.
+smtpSocketWriteTimeout=Socket write timeout
+smtpSocketWriteTimeoutHelp=The timeout in milliseconds for writing to the SMTP server.
diff --git a/js/apps/admin-ui/src/realm-settings/EmailTab.tsx b/js/apps/admin-ui/src/realm-settings/EmailTab.tsx
index 4ee4771a3b1..435c696ce93 100644
--- a/js/apps/admin-ui/src/realm-settings/EmailTab.tsx
+++ b/js/apps/admin-ui/src/realm-settings/EmailTab.tsx
@@ -312,6 +312,30 @@ export const RealmSettingsEmailTab = ({
labelOff={t("disabled")}
stringify
/>
+
+
+
config, String from) throws EmailException {
+ Properties buildEmailProperties(Map config, String from) throws EmailException {
Properties props = new Properties();
if (config.containsKey("host")) {
@@ -142,9 +142,9 @@ public class DefaultEmailSenderProvider implements EmailSenderProvider {
setupTruststore(props);
}
- props.setProperty("mail.smtp.timeout", "10000");
- props.setProperty("mail.smtp.connectiontimeout", "10000");
- props.setProperty("mail.smtp.writetimeout", "10000");
+ props.setProperty("mail.smtp.timeout", config.getOrDefault("timeout", "10000"));
+ props.setProperty("mail.smtp.connectiontimeout", config.getOrDefault("connectionTimeout", "10000"));
+ props.setProperty("mail.smtp.writetimeout", config.getOrDefault("writeTimeout", "10000"));
String envelopeFrom = config.get("envelopeFrom");
if (isNotBlank(envelopeFrom)) {
diff --git a/services/src/test/java/org/keycloak/email/DefaultEmailSenderProviderTest.java b/services/src/test/java/org/keycloak/email/DefaultEmailSenderProviderTest.java
new file mode 100644
index 00000000000..a711c3bf274
--- /dev/null
+++ b/services/src/test/java/org/keycloak/email/DefaultEmailSenderProviderTest.java
@@ -0,0 +1,54 @@
+package org.keycloak.email;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+class DefaultEmailSenderProviderTest {
+
+ @Test
+ void testEmailTimeoutPropertiesDefaults() throws EmailException {
+ // given
+ DefaultEmailSenderProvider defaultEmailSenderProvider = new DefaultEmailSenderProvider(
+ null, null
+ );
+ String from = "test@keycloak.com";
+
+ Map config = new HashMap<>();
+
+ // when
+ Properties properties = defaultEmailSenderProvider.buildEmailProperties(config, from);
+
+ // then
+ assertThat(properties.getProperty("mail.smtp.timeout"), is("10000"));
+ assertThat(properties.getProperty("mail.smtp.connectiontimeout"), is("10000"));
+ assertThat(properties.getProperty("mail.smtp.writetimeout"), is("10000"));
+ }
+
+ @Test
+ void testEmailTimeoutPropertiesFromConfig() throws EmailException {
+ // given
+ DefaultEmailSenderProvider defaultEmailSenderProvider = new DefaultEmailSenderProvider(
+ null, null
+ );
+ String from = "test@keycloak.com";
+
+ Map config = new HashMap<>();
+ config.put("timeout", "20000");
+ config.put("connectionTimeout", "30000");
+ config.put("writeTimeout", "40000");
+
+ // when
+ Properties properties = defaultEmailSenderProvider.buildEmailProperties(config, from);
+
+ // then
+ assertThat(properties.getProperty("mail.smtp.timeout"), is("20000"));
+ assertThat(properties.getProperty("mail.smtp.connectiontimeout"), is("30000"));
+ assertThat(properties.getProperty("mail.smtp.writetimeout"), is("40000"));
+ }
+}