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")); + } +}