[Improve] Merge dev-2.1.3 Docker & Email BackedEnd Improve Into dev (#3594)

diff --git a/streampark-console/streampark-console-service/src/main/assembly/script/data/mysql-data.sql b/streampark-console/streampark-console-service/src/main/assembly/script/data/mysql-data.sql
index be58d97..5ae0603 100644
--- a/streampark-console/streampark-console-service/src/main/assembly/script/data/mysql-data.sql
+++ b/streampark-console/streampark-console-service/src/main/assembly/script/data/mysql-data.sql
@@ -275,22 +275,20 @@
 -- ----------------------------
 -- Records of t_setting
 -- ----------------------------
-insert into `t_setting` values (1, 'streampark.maven.settings', null, 'Maven Settings File Path', 'Maven Settings.xml 完整路径', 1);
-insert into `t_setting` values (2, 'streampark.maven.central.repository', null, 'Maven Central Repository', 'Maven 私服地址', 1);
-insert into `t_setting` values (3, 'streampark.maven.auth.user', null, 'Maven Central Repository Auth User', 'Maven 私服认证用户名', 1);
-insert into `t_setting` values (4, 'streampark.maven.auth.password', null, 'Maven Central Repository Auth Password', 'Maven 私服认证密码', 1);
-insert into `t_setting` values (5, 'alert.email.host', null, 'Alert Email Smtp Host', '告警邮箱Smtp Host', 1);
-insert into `t_setting` values (6, 'alert.email.port', null, 'Alert Email Smtp Port', '告警邮箱的Smtp Port', 1);
-insert into `t_setting` values (7, 'alert.email.from', null, 'Alert  Email From', '发送告警的邮箱', 1);
-insert into `t_setting` values (8, 'alert.email.userName', null, 'Alert  Email User', '用来发送告警邮箱的认证用户名', 1);
-insert into `t_setting` values (0, 'alert.email.password', null, 'Alert Email Password', '用来发送告警邮箱的认证密码', 1);
-insert into `t_setting` values (10, 'alert.email.ssl', 'false', 'Alert Email Is SSL', '发送告警的邮箱是否开启SSL', 2);
-insert into `t_setting` values (11, 'docker.register.address', null, 'Docker Register Address', 'Docker容器服务地址', 1);
-insert into `t_setting` values (12, 'docker.register.user', null, 'Docker Register User', 'Docker容器服务认证用户名', 1);
-insert into `t_setting` values (13, 'docker.register.password', null, 'Docker Register Password', 'Docker容器服务认证密码', 1);
-insert into `t_setting` values (14, 'docker.register.namespace', null, 'Namespace for docker image used in docker building env and target image register', 'Docker命名空间', 1);
-insert into `t_setting` values (15, 'ingress.mode.default', null, 'Automatically generate an nginx-based ingress by passing in a domain name', 'Ingress域名地址', 1);
-
+insert into `t_setting` values (1, 'streampark.maven.settings', null, 'Maven Settings File Path', 'Maven Settings.xml full path', 1);
+insert into `t_setting` values (2, 'streampark.maven.central.repository', null, 'Maven Central Repository', 'Maven private server address', 1);
+insert into `t_setting` values (3, 'streampark.maven.auth.user', null, 'Maven Central Repository Auth User', 'Maven private server authentication username', 1);
+insert into `t_setting` values (4, 'streampark.maven.auth.password', null, 'Maven Central Repository Auth Password', 'Maven private server authentication password', 1);
+insert into `t_setting` values (5, 'alert.email.host', null, 'Alert Email Smtp Host', 'Alert Mailbox Smtp Host', 1);
+insert into `t_setting` values (6, 'alert.email.port', null, 'Alert Email Smtp Port', 'Smtp Port of the alarm mailbox', 1);
+insert into `t_setting` values (7, 'alert.email.from', null, 'Alert Sender Email', 'Email to send alerts', 1);
+insert into `t_setting` values (8, 'alert.email.userName', null, 'Alert  Email User', 'Authentication username used to send alert emails', 1);
+insert into `t_setting` values (9, 'alert.email.password', null, 'Alert Email Password', 'Authentication password used to send alarm email', 1);
+insert into `t_setting` values (10, 'alert.email.ssl', 'false', 'Alert Email SSL', 'Whether to enable SSL in the mailbox that sends the alert', 2);insert into `t_setting` values (11, 'docker.register.address', null, 'Docker Register Address', 'Docker container service address', 1);
+insert into `t_setting` values (12, 'docker.register.user', null, 'Docker Register User', 'Docker container service authentication username', 1);
+insert into `t_setting` values (13, 'docker.register.password', null, 'Docker Register Password', 'Docker container service authentication password', 1);
+insert into `t_setting` values (14, 'docker.register.namespace', null, 'Docker namespace', 'Namespace for docker image used in docker building env and target image register', 1);
+insert into `t_setting` values (15, 'ingress.mode.default', null, 'Ingress domain address', 'Automatically generate an nginx-based ingress by passing in a domain name', 1);
 -- ----------------------------
 -- Records of t_user
 -- ----------------------------
diff --git a/streampark-console/streampark-console-service/src/main/assembly/script/data/pgsql-data.sql b/streampark-console/streampark-console-service/src/main/assembly/script/data/pgsql-data.sql
index 1e9246a..0e5a964 100644
--- a/streampark-console/streampark-console-service/src/main/assembly/script/data/pgsql-data.sql
+++ b/streampark-console/streampark-console-service/src/main/assembly/script/data/pgsql-data.sql
@@ -240,22 +240,21 @@
 -- ----------------------------
 -- Records of t_setting
 -- ----------------------------
-insert into "public"."t_setting" values (1, 'streampark.maven.settings', null, 'Maven Settings File Path', 'Maven Settings.xml 完整路径', 1);
-insert into "public"."t_setting" values (2, 'streampark.maven.central.repository', null, 'Maven Central Repository', 'Maven 私服地址', 1);
-insert into "public"."t_setting" values (3, 'streampark.maven.auth.user', null, 'Maven Central Repository Auth User', 'Maven 私服认证用户名', 1);
-insert into "public"."t_setting" values (4, 'streampark.maven.auth.password', null, 'Maven Central Repository Auth Password', 'Maven 私服认证密码', 1);
-insert into "public"."t_setting" values (5, 'alert.email.host', null, 'Alert Email Smtp Host', '告警邮箱Smtp Host', 1);
-insert into "public"."t_setting" values (6, 'alert.email.port', null, 'Alert Email Smtp Port', '告警邮箱的Smtp Port', 1);
-insert into "public"."t_setting" values (7, 'alert.email.from', null, 'Alert  Email From', '发送告警的邮箱', 1);
-insert into "public"."t_setting" values (8, 'alert.email.userName', null, 'Alert  Email User', '用来发送告警邮箱的认证用户名', 1);
-insert into "public"."t_setting" values (9, 'alert.email.password', null, 'Alert Email Password', '用来发送告警邮箱的认证密码', 1);
-insert into "public"."t_setting" values (10, 'alert.email.ssl', 'false', 'Alert Email Is SSL', '发送告警的邮箱是否开启SSL', 2);
-insert into "public"."t_setting" values (11, 'docker.register.address', null, 'Docker Register Address', 'Docker容器服务地址', 1);
-insert into "public"."t_setting" values (12, 'docker.register.user', null, 'Docker Register User', 'Docker容器服务认证用户名', 1);
-insert into "public"."t_setting" values (13, 'docker.register.password', null, 'Docker Register Password', 'Docker容器服务认证密码', 1);
-insert into "public"."t_setting" values (14, 'docker.register.namespace', null, 'Namespace for docker image used in docker building env and target image register', 'Docker命名空间', 1);
-insert into "public"."t_setting" values (15, 'ingress.mode.default', null, 'Automatically generate an nginx-based ingress by passing in a domain name', 'Ingress域名地址', 1);
-
+insert into "public"."t_setting" values (1, 'streampark.maven.settings', null, 'Maven Settings File Path', 'Maven Settings.xml full path', 1);
+insert into "public"."t_setting" values (2, 'streampark.maven.central.repository', null, 'Maven Central Repository', 'Maven private server address', 1);
+insert into "public"."t_setting" values (3, 'streampark.maven.auth.user', null, 'Maven Central Repository Auth User', 'Maven private server authentication username', 1);
+insert into "public"."t_setting" values (4, 'streampark.maven.auth.password', null, 'Maven Central Repository Auth Password', 'Maven private server authentication password', 1);
+insert into "public"."t_setting" values (5, 'alert.email.host', null, 'Alert Email Smtp Host', 'Alert Mailbox Smtp Host', 1);
+insert into "public"."t_setting" values (6, 'alert.email.port', null, 'Alert Email Smtp Port', 'Smtp Port of the alarm mailbox', 1);
+insert into "public"."t_setting" values (7, 'alert.email.from', null, 'Alert Sender Email', 'Email to send alerts', 1);
+insert into "public"."t_setting" values (8, 'alert.email.userName', null, 'Alert  Email User', 'Authentication username used to send alert emails', 1);
+insert into "public"."t_setting" values (9, 'alert.email.password', null, 'Alert Email Password', 'Authentication password used to send alarm email', 1);
+insert into "public"."t_setting" values (10, 'alert.email.ssl', 'false', 'Alert Email SSL', 'Whether to enable SSL in the mailbox that sends the alert', 2);
+insert into "public"."t_setting" values (11, 'docker.register.address', null, 'Docker Register Address', 'Docker container service address', 1);
+insert into "public"."t_setting" values (12, 'docker.register.user', null, 'Docker Register User', 'Docker container service authentication username', 1);
+insert into "public"."t_setting" values (13, 'docker.register.password', null, 'Docker Register Password', 'Docker container service authentication password', 1);
+insert into "public"."t_setting" values (14, 'docker.register.namespace', null, 'Docker namespace', 'Namespace for docker image used in docker building env and target image register', 1);
+insert into "public"."t_setting" values (15, 'ingress.mode.default', null, 'Ingress domain address', 'Automatically generate an nginx-based ingress by passing in a domain name', 1);
 -- ----------------------------
 -- Records of t_user
 -- ----------------------------
diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/DockerConfig.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/DockerConfig.java
index 9be549f..a9c0544 100644
--- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/DockerConfig.java
+++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/DockerConfig.java
@@ -17,14 +17,18 @@
 
 package org.apache.streampark.console.core.bean;
 
+import org.apache.streampark.console.core.entity.Setting;
 import org.apache.streampark.console.core.service.SettingService;
 
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.Arrays;
+import java.util.List;
+
 /**
- * The DockerConfig class represents the configuration for an email system. It holds the SMTP host,
- * port, from address, username, password, and whether SSL is enabled.
+ * The DockerConfig class represents the configuration for docker system. It holds Registered
+ * address, username, password, and namespace.
  *
  * <p>This class also provides a static factory method to create an DockerConfig object from a map
  * of settings.
@@ -34,7 +38,7 @@
 public class DockerConfig {
 
   private String address;
-  private String user;
+  private String username;
   private String password;
   private String namespace;
 
@@ -47,7 +51,7 @@
               .get(SettingService.KEY_DOCKER_REGISTER_ADDRESS)
               .getSettingValue());
 
-      dockerConfig.setUser(
+      dockerConfig.setUsername(
           SettingService.SETTINGS.get(SettingService.KEY_DOCKER_REGISTER_USER).getSettingValue());
 
       dockerConfig.setPassword(
@@ -66,4 +70,23 @@
     }
     return null;
   }
+
+  public static List<Setting> toSettings(DockerConfig dockerConfig) {
+    Setting address = new Setting();
+    address.setSettingKey(SettingService.KEY_DOCKER_REGISTER_ADDRESS);
+    address.setSettingValue(dockerConfig.getAddress());
+
+    Setting username = new Setting();
+    username.setSettingKey(SettingService.KEY_DOCKER_REGISTER_USER);
+    username.setSettingValue(dockerConfig.getUsername());
+
+    Setting password = new Setting();
+    password.setSettingKey(SettingService.KEY_DOCKER_REGISTER_PASSWORD);
+    password.setSettingValue(dockerConfig.getPassword());
+
+    Setting namespace = new Setting();
+    namespace.setSettingKey(SettingService.KEY_DOCKER_REGISTER_NAMESPACE);
+    namespace.setSettingValue(dockerConfig.getNamespace());
+    return Arrays.asList(address, username, password, namespace);
+  }
 }
diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/SenderEmail.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/SenderEmail.java
new file mode 100644
index 0000000..30ee35f
--- /dev/null
+++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/bean/SenderEmail.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.console.core.bean;
+
+import org.apache.streampark.console.core.entity.Setting;
+import org.apache.streampark.console.core.service.SettingService;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Getter
+@Setter
+public class SenderEmail {
+
+  private String host;
+  private Integer port;
+  private String from;
+  private String userName;
+  private String password;
+  private boolean ssl;
+
+  public static List<Setting> toSettings(SenderEmail senderEmail) {
+    Setting smtpHost = new Setting();
+    smtpHost.setSettingKey(SettingService.KEY_ALERT_EMAIL_HOST);
+    smtpHost.setSettingValue(senderEmail.getHost());
+
+    Setting smtpPort = new Setting();
+    smtpPort.setSettingKey(SettingService.KEY_ALERT_EMAIL_PORT);
+    smtpPort.setSettingValue(senderEmail.getPort().toString());
+
+    Setting smtpFrom = new Setting();
+    smtpFrom.setSettingKey(SettingService.KEY_ALERT_EMAIL_FROM);
+    smtpFrom.setSettingValue(senderEmail.getFrom());
+
+    Setting smtpUserName = new Setting();
+    smtpUserName.setSettingKey(SettingService.KEY_ALERT_EMAIL_USERNAME);
+    smtpUserName.setSettingValue(senderEmail.getUserName());
+
+    Setting smtpPassword = new Setting();
+    smtpPassword.setSettingKey(SettingService.KEY_ALERT_EMAIL_PASSWORD);
+    smtpPassword.setSettingValue(senderEmail.getPassword());
+
+    Setting smtpSsl = new Setting();
+    smtpSsl.setSettingKey(SettingService.KEY_ALERT_EMAIL_SSL);
+    smtpSsl.setSettingValue(senderEmail.isSsl() + "");
+
+    return Arrays.asList(smtpHost, smtpPort, smtpFrom, smtpUserName, smtpPassword, smtpSsl);
+  }
+}
diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
index 82f4636..6517e7e 100644
--- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
+++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/controller/SettingController.java
@@ -19,6 +19,9 @@
 
 import org.apache.streampark.common.util.HadoopUtils;
 import org.apache.streampark.console.base.domain.RestResponse;
+import org.apache.streampark.console.core.bean.DockerConfig;
+import org.apache.streampark.console.core.bean.ResponseResult;
+import org.apache.streampark.console.core.bean.SenderEmail;
 import org.apache.streampark.console.core.entity.Setting;
 import org.apache.streampark.console.core.service.SettingService;
 
@@ -70,6 +73,54 @@
     return RestResponse.success(updated);
   }
 
+  @Operation(summary = "get Docker config")
+  @PostMapping("docker")
+  @RequiresPermissions("setting:view")
+  public RestResponse docker() {
+    DockerConfig dockerConfig = DockerConfig.fromSetting();
+    return RestResponse.success(dockerConfig);
+  }
+
+  @Operation(summary = "check docker setting")
+  @PostMapping("check/docker")
+  @RequiresPermissions("setting:view")
+  public RestResponse checkDocker(DockerConfig dockerConfig) {
+    ResponseResult result = settingService.checkDocker(dockerConfig);
+    return RestResponse.success(result);
+  }
+
+  @Operation(summary = "Update docker setting")
+  @PostMapping("update/docker")
+  @RequiresPermissions("setting:update")
+  public RestResponse updateDocker(DockerConfig dockerConfig) {
+    boolean updated = settingService.updateDocker(dockerConfig);
+    return RestResponse.success(updated);
+  }
+
+  @Operation(summary = "get sender email")
+  @PostMapping("email")
+  @RequiresPermissions("setting:view")
+  public RestResponse email() {
+    SenderEmail senderEmail = settingService.getSenderEmail();
+    return RestResponse.success(senderEmail);
+  }
+
+  @Operation(summary = "check email")
+  @PostMapping("check/email")
+  @RequiresPermissions("setting:view")
+  public RestResponse checkEmail(SenderEmail senderEmail) {
+    ResponseResult result = settingService.checkEmail(senderEmail);
+    return RestResponse.success(result);
+  }
+
+  @Operation(summary = "Update sender email")
+  @PostMapping("update/email")
+  @RequiresPermissions("setting:update")
+  public RestResponse updateEmail(SenderEmail senderEmail) {
+    boolean updated = settingService.updateEmail(senderEmail);
+    return RestResponse.success(updated);
+  }
+
   @Operation(summary = "Check hadoop status")
   @PostMapping("checkHadoop")
   public RestResponse checkHadoop() {
diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/SettingService.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/SettingService.java
index 16a01c6..4be5c39 100644
--- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/SettingService.java
+++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/SettingService.java
@@ -19,6 +19,8 @@
 
 import org.apache.streampark.console.core.bean.DockerConfig;
 import org.apache.streampark.console.core.bean.MavenConfig;
+import org.apache.streampark.console.core.bean.ResponseResult;
+import org.apache.streampark.console.core.bean.SenderEmail;
 import org.apache.streampark.console.core.entity.Setting;
 
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -92,4 +94,45 @@
    * @return The default ingress mode.
    */
   String getIngressModeDefault();
+
+  /**
+   * Before updating the Docker settings, verify that the parameters are filled in correctly, We
+   * check whether it is correct or not by concatenating the given registration URL.
+   *
+   * @param dockerConfig Docker config to be checked
+   * @return Server response value
+   */
+  ResponseResult checkDocker(DockerConfig dockerConfig);
+
+  /**
+   * update docker config
+   *
+   * @param dockerConfig Docker config needs to be updated
+   * @return Whether the update operation was successful
+   */
+  boolean updateDocker(DockerConfig dockerConfig);
+
+  /**
+   * Retrieves the senderEmail
+   *
+   * @return
+   */
+  SenderEmail getSenderEmail();
+
+  /**
+   * Before updating the email settings, verify that the parameters are filled in correctly, We
+   * check whether it is correct or not by concatenating the given host.
+   *
+   * @param senderEmail email config to be checked
+   * @return Server response value
+   */
+  ResponseResult checkEmail(SenderEmail senderEmail);
+
+  /**
+   * update docker config
+   *
+   * @param senderEmail email config needs to be updated
+   * @return Whether the update operation was successful
+   */
+  boolean updateEmail(SenderEmail senderEmail);
 }
diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/AppBuildPipeServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/AppBuildPipeServiceImpl.java
index 37c09e9..ffcafc2 100644
--- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/AppBuildPipeServiceImpl.java
+++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/AppBuildPipeServiceImpl.java
@@ -523,7 +523,7 @@
             DockerConf.of(
                 dockerConfig.getAddress(),
                 dockerConfig.getNamespace(),
-                dockerConfig.getUser(),
+                dockerConfig.getUsername(),
                 dockerConfig.getPassword()),
             app.getIngressTemplate());
     return k8sApplicationBuildRequest;
diff --git a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/SettingServiceImpl.java b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/SettingServiceImpl.java
index bba0b91..3d49aad 100644
--- a/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/SettingServiceImpl.java
+++ b/streampark-console/streampark-console-service/src/main/java/org/apache/streampark/console/core/service/impl/SettingServiceImpl.java
@@ -19,6 +19,8 @@
 
 import org.apache.streampark.console.core.bean.DockerConfig;
 import org.apache.streampark.console.core.bean.MavenConfig;
+import org.apache.streampark.console.core.bean.ResponseResult;
+import org.apache.streampark.console.core.bean.SenderEmail;
 import org.apache.streampark.console.core.entity.Setting;
 import org.apache.streampark.console.core.mapper.SettingMapper;
 import org.apache.streampark.console.core.service.SettingService;
@@ -27,14 +29,27 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.model.AuthConfig;
+import com.github.dockerjava.api.model.AuthResponse;
+import com.github.dockerjava.core.DefaultDockerClientConfig;
+import com.github.dockerjava.core.DockerClientConfig;
+import com.github.dockerjava.core.DockerClientImpl;
+import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
+import com.github.dockerjava.transport.DockerHttpClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.PostConstruct;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.Transport;
 
+import java.util.List;
 import java.util.Optional;
+import java.util.Properties;
 
 @Slf4j
 @Service
@@ -101,4 +116,119 @@
         .getOrDefault(SettingService.KEY_INGRESS_MODE_DEFAULT, emptySetting)
         .getSettingValue();
   }
+
+  @Override
+  public ResponseResult checkDocker(DockerConfig dockerConfig) {
+    DockerClientConfig config =
+        DefaultDockerClientConfig.createDefaultConfigBuilder()
+            .withRegistryUrl(dockerConfig.getAddress())
+            .build();
+
+    DockerHttpClient httpClient =
+        new ApacheDockerHttpClient.Builder().dockerHost(config.getDockerHost()).build();
+
+    ResponseResult result = new ResponseResult();
+
+    try (DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient)) {
+      AuthConfig authConfig =
+          new AuthConfig()
+              .withUsername(dockerConfig.getUsername())
+              .withPassword(dockerConfig.getPassword())
+              .withRegistryAddress(dockerConfig.getAddress());
+      AuthResponse response = dockerClient.authCmd().withAuthConfig(authConfig).exec();
+      if (response.getStatus().equals("Login Succeeded")) {
+        result.setStatus(200);
+      } else {
+        result.setStatus(500);
+        result.setMsg("docker login failed, status: " + response.getStatus());
+      }
+    } catch (Exception e) {
+      if (e.getMessage().contains("LastErrorException")) {
+        result.setStatus(400);
+      } else if (e.getMessage().contains("Status 401")) {
+        result.setStatus(500);
+        result.setMsg(
+            "Failed to validate Docker registry, unauthorized: incorrect username or password ");
+      } else {
+        result.setStatus(500);
+        result.setMsg("Failed to validate Docker registry, error: " + e.getMessage());
+      }
+    }
+    return result;
+  }
+
+  @Override
+  public boolean updateDocker(DockerConfig dockerConfig) {
+    List<Setting> settings = DockerConfig.toSettings(dockerConfig);
+    for (Setting each : settings) {
+      if (!update(each)) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @Override
+  public SenderEmail getSenderEmail() {
+    try {
+      String host = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_HOST).getSettingValue();
+      String port = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_PORT).getSettingValue();
+      String from = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_FROM).getSettingValue();
+      String userName = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_USERNAME).getSettingValue();
+      String password = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_PASSWORD).getSettingValue();
+      String ssl = SETTINGS.get(SettingService.KEY_ALERT_EMAIL_SSL).getSettingValue();
+
+      SenderEmail senderEmail = new SenderEmail();
+      senderEmail.setHost(host);
+      if (StringUtils.isNotBlank(port)) {
+        senderEmail.setPort(Integer.parseInt(port));
+      }
+      senderEmail.setFrom(from);
+      senderEmail.setUserName(userName);
+      senderEmail.setPassword(password);
+      if (StringUtils.isNotBlank(ssl)) {
+        senderEmail.setSsl(Boolean.parseBoolean(ssl));
+      }
+      return senderEmail;
+    } catch (Exception e) {
+      log.warn("Fault Alert Email is not set.");
+    }
+    return null;
+  }
+
+  @Override
+  public ResponseResult checkEmail(SenderEmail senderEmail) {
+    ResponseResult result = new ResponseResult();
+    Properties props = new Properties();
+    props.put("mail.smtp.auth", "true");
+    if (senderEmail.isSsl()) {
+      props.put("mail.smtp.starttls.enable", "true");
+    }
+    props.put("mail.smtp.host", senderEmail.getHost());
+    props.put("mail.smtp.port", senderEmail.getPort());
+
+    Session session = Session.getInstance(props);
+    try {
+      Transport transport = session.getTransport("smtp");
+      transport.connect(
+          senderEmail.getHost(), senderEmail.getUserName(), senderEmail.getPassword());
+      transport.close();
+      result.setStatus(200);
+    } catch (MessagingException e) {
+      result.setStatus(500);
+      result.setMsg("connect to target mail server failed: " + e.getMessage());
+    }
+    return result;
+  }
+
+  @Override
+  public boolean updateEmail(SenderEmail senderEmail) {
+    List<Setting> settings = SenderEmail.toSettings(senderEmail);
+    for (Setting each : settings) {
+      if (!update(each)) {
+        return false;
+      }
+    }
+    return true;
+  }
 }
diff --git a/streampark-console/streampark-console-service/src/main/resources/db/data-h2.sql b/streampark-console/streampark-console-service/src/main/resources/db/data-h2.sql
index d418c26..3434335 100644
--- a/streampark-console/streampark-console-service/src/main/resources/db/data-h2.sql
+++ b/streampark-console/streampark-console-service/src/main/resources/db/data-h2.sql
@@ -282,8 +282,8 @@
 insert into `t_setting` values (11, 'docker.register.address', null, 'Docker Register Address', 'Docker container service address', 1);
 insert into `t_setting` values (12, 'docker.register.user', null, 'Docker Register User', 'Docker container service authentication username', 1);
 insert into `t_setting` values (13, 'docker.register.password', null, 'Docker Register Password', 'Docker container service authentication password', 1);
-insert into `t_setting` values (14, 'docker.register.namespace', null, 'Namespace for docker image used in docker building env and target image register', 'Docker namespace', 1);
-insert into `t_setting` values (15, 'ingress.mode.default', null, 'Automatically generate an nginx-based ingress by passing in a domain name', 'Ingress domain address', 1);
+insert into `t_setting` values (14, 'docker.register.namespace', null, 'Docker namespace', 'Namespace for docker image used in docker building env and target image register', 1);
+insert into `t_setting` values (15, 'ingress.mode.default', null, 'Ingress domain address', 'Automatically generate an nginx-based ingress by passing in a domain name', 1);
 
 -- ----------------------------
 -- Records of t_user
diff --git a/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/SettingServiceTest.java b/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/SettingServiceTest.java
new file mode 100644
index 0000000..eb744fe
--- /dev/null
+++ b/streampark-console/streampark-console-service/src/test/java/org/apache/streampark/console/core/service/SettingServiceTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.streampark.console.core.service;
+
+import org.apache.streampark.console.SpringUnitTestBase;
+import org.apache.streampark.console.core.bean.DockerConfig;
+import org.apache.streampark.console.core.bean.ResponseResult;
+import org.apache.streampark.console.core.bean.SenderEmail;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@Disabled("'ese test cases can't be runnable due to external service is not available.")
+class SettingServiceTest extends SpringUnitTestBase {
+
+  @Autowired SettingService settingService;
+
+  @Test
+  void testUpdateDockerConfigTest() {
+    DockerConfig dockerConfig = new DockerConfig();
+    dockerConfig.setUsername("test-username-setting-value");
+    dockerConfig.setPassword("test-password-setting-value");
+    dockerConfig.setNamespace("test-namespace-setting-value");
+    dockerConfig.setAddress("test-address-setting-value");
+
+    settingService.updateDocker(dockerConfig);
+
+    Assertions.assertEquals(
+        "test-address-setting-value",
+        settingService.get(SettingService.KEY_DOCKER_REGISTER_ADDRESS).getSettingValue());
+    Assertions.assertEquals(
+        "test-username-setting-value",
+        settingService.get(SettingService.KEY_DOCKER_REGISTER_USER).getSettingValue());
+    Assertions.assertEquals(
+        "test-password-setting-value",
+        settingService.get(SettingService.KEY_DOCKER_REGISTER_PASSWORD).getSettingValue());
+    Assertions.assertEquals(
+        "test-namespace-setting-value",
+        settingService.get(SettingService.KEY_DOCKER_REGISTER_NAMESPACE).getSettingValue());
+  }
+
+  @Test
+  void testUpdateAlertEmailConfigTest() {
+    SenderEmail senderEmail = new SenderEmail();
+    senderEmail.setHost("test-host-setting-value");
+    senderEmail.setUserName("test-username-setting-value");
+    senderEmail.setPassword("test-password-setting-value");
+    senderEmail.setFrom("test-from-setting-value");
+    senderEmail.setSsl(true);
+    senderEmail.setPort(456);
+
+    settingService.updateEmail(senderEmail);
+
+    Assertions.assertEquals(
+        "test-host-setting-value",
+        settingService.get(SettingService.KEY_ALERT_EMAIL_HOST).getSettingValue());
+    Assertions.assertEquals(
+        "test-from-setting-value",
+        settingService.get(SettingService.KEY_ALERT_EMAIL_FROM).getSettingValue());
+    Assertions.assertEquals(
+        "test-username-setting-value",
+        settingService.get(SettingService.KEY_ALERT_EMAIL_USERNAME).getSettingValue());
+    Assertions.assertEquals(
+        "test-password-setting-value",
+        settingService.get(SettingService.KEY_ALERT_EMAIL_PASSWORD).getSettingValue());
+    Assertions.assertEquals(
+        "456", settingService.get(SettingService.KEY_ALERT_EMAIL_PORT).getSettingValue());
+    Assertions.assertEquals(
+        "true", settingService.get(SettingService.KEY_ALERT_EMAIL_SSL).getSettingValue());
+  }
+
+  @Test
+  void checkEmailTest() {
+    SenderEmail senderEmail = new SenderEmail();
+    senderEmail.setHost("smtp.163.com");
+    senderEmail.setUserName("XXXXXXXX@163.com");
+    senderEmail.setPassword("XXXXXXXX");
+    senderEmail.setFrom("XXXXXXXX@163.com");
+    senderEmail.setSsl(false);
+    senderEmail.setPort(25);
+    ResponseResult result = settingService.checkEmail(senderEmail);
+    Assertions.assertEquals(result.getStatus(), 200);
+  }
+
+  @Test
+  void checkDockerTest() {
+    String username = "XXXXXXXX ";
+    String password = "XXXXXXXX";
+
+    DockerConfig dockerConfig = new DockerConfig();
+    dockerConfig.setAddress("registry.cn-hangzhou.aliyuncs.com");
+    dockerConfig.setUsername(username);
+    dockerConfig.setPassword(password);
+    dockerConfig.setNamespace("streampark");
+
+    ResponseResult result = settingService.checkDocker(dockerConfig);
+    Assertions.assertEquals(result.getStatus(), 200);
+  }
+}