From fa677055cc04528803635beae505c9a495d2e1b8 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Mon, 20 Jan 2014 10:31:47 +0000 Subject: [PATCH] Minor improvements to email config in admin console. Added documentation for configuring smtp server --- .../admin/partials/realm-credentials.html | 2 +- .../admin/partials/realm-default-roles.html | 2 +- .../admin/partials/realm-detail.html | 2 +- .../resources/admin/partials/realm-keys.html | 2 +- .../resources/admin/partials/realm-smtp.html | 14 +++--- .../admin/partials/realm-social.html | 2 +- .../admin/partials/realm-tokens.html | 2 +- .../resources/admin/partials/role-detail.html | 2 +- .../resources/admin/partials/role-list.html | 2 +- docbook/reference/en/en-US/master.xml | 10 +++++ docbook/reference/en/en-US/modules/email.xml | 40 ++++++++++++++++++ .../en/images/email-simple-example.png | Bin 0 -> 14926 bytes 12 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 docbook/reference/en/en-US/modules/email.xml create mode 100644 docbook/reference/en/images/email-simple-example.png diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-credentials.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-credentials.html index d027574ebe..a02eb1a800 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-credentials.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-credentials.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-default-roles.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-default-roles.html index e2a5314a64..6644ef2876 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-default-roles.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-default-roles.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-detail.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-detail.html index 726d56f005..c71a4a6bcf 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-detail.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-detail.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-keys.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-keys.html index a05f12bae2..b00c96982c 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-keys.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-keys.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-smtp.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-smtp.html index 1f685f9f0f..2a2d3138f2 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-smtp.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-smtp.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • @@ -20,7 +20,7 @@
  • Settings
  • SMTP Configuration
  • -

    {{realm.realm}} SMTP Settings

    +

    {{realm.realm}} Email Server Settings

    * Required fields

    @@ -40,7 +40,7 @@
    - +
    @@ -53,18 +53,18 @@
    - Authentication + Authentication
    - +
    -
    +
    -
    +
    diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-social.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-social.html index b78cfa0b4a..5a75457465 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-social.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-social.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-tokens.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-tokens.html index 0ea6617ef7..802bc45eb4 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-tokens.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/realm-tokens.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-detail.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-detail.html index 3e05f3495c..50cf51243d 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-detail.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-detail.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • diff --git a/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-list.html b/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-list.html index 213342a9ba..34af283493 100755 --- a/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-list.html +++ b/admin-ui/src/main/resources/META-INF/resources/admin/partials/role-list.html @@ -11,7 +11,7 @@
  • Credentials
  • Token
  • Keys
  • -
  • SMTP
  • +
  • Email
  • diff --git a/docbook/reference/en/en-US/master.xml b/docbook/reference/en/en-US/master.xml index dbc06a794e..f2c39208f5 100755 --- a/docbook/reference/en/en-US/master.xml +++ b/docbook/reference/en/en-US/master.xml @@ -12,6 +12,7 @@ + ]> @@ -72,6 +73,15 @@ &SocialProviderSPI; + + Email + + Keycloak sends emails to users to verify their email address. Emails are also used to allow users to + safely restore their username and passwords. + + &Email; + + diff --git a/docbook/reference/en/en-US/modules/email.xml b/docbook/reference/en/en-US/modules/email.xml new file mode 100644 index 0000000000..692952ab0e --- /dev/null +++ b/docbook/reference/en/en-US/modules/email.xml @@ -0,0 +1,40 @@ +
    + Email Server Config + + To enable Keycloak to send emails you need to provide Keycloak with your SMTP server settings. If you don't have + a SMTP server you can use one of many hosted solutions (such as Sendgrid or smtp2go). + + + + To configure your SMTP server, open the Keycloak Admin Console, select your realm from the drop-down box in the + top-menu, then click on Email in the sub-menu. + + + + You are required to fill in the Host and Port for your SMTP server (the default port for SMTP is 25). You also have + to specify the sender email address (From). The other options are optional. + + + + The screenshot below shows a simple example where the SMTP server doesn't use SSL or TLS and doesn't require authentication. + + + + +
    + Enable SSL or TLS + + As emails are used for recovering usernames and passwords it's recommended to use SSL or TLS, especially if the SMTP server + is on an external network. To enable SSL click on Enable SSL or to enable TLS click on Enable TLS. + You will most likely also need to change the Port (the default port for SSL/TLS is 465). + +
    + +
    + Authentication + + If your SMTP server requires authentication click on Enable Authentication and insert + the Username and Password. + +
    +
    \ No newline at end of file diff --git a/docbook/reference/en/images/email-simple-example.png b/docbook/reference/en/images/email-simple-example.png new file mode 100644 index 0000000000000000000000000000000000000000..9c341e2e2a9c4a77c4367381b03c5e4a1bb416d3 GIT binary patch literal 14926 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 TRCI_t3II}K@}J8^^uPTth0Vb? literal 0 HcmV?d00001