diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/pom.xml b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/pom.xml
new file mode 100644
index 0000000000..37e7899a03
--- /dev/null
+++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/pom.xml
@@ -0,0 +1,41 @@
+
+
+
+
+ dolphinscheduler-alert-plugins
+ org.apache.dolphinscheduler
+ 2.0.4-SNAPSHOT
+
+ 4.0.0
+ dolphinscheduler-alert-webexteams
+ jar
+
+
+
+ com.google.guava
+ guava
+
+
+
+ org.apache.httpcomponents
+ httpclient
+
+
+
diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexMessage.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexMessage.java
new file mode 100644
index 0000000000..f1b908ff6c
--- /dev/null
+++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexMessage.java
@@ -0,0 +1,75 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.webexteams;
+
+public class WebexMessage {
+ private String roomId;
+ private String toPersonId;
+ private String toPersonEmail;
+ private String text;
+ private String markdown;
+ private String html;
+
+ public String getRoomId() {
+ return roomId;
+ }
+
+ public void setRoomId(String roomId) {
+ this.roomId = roomId;
+ }
+
+ public String getToPersonId() {
+ return toPersonId;
+ }
+
+ public void setToPersonId(String toPersonId) {
+ this.toPersonId = toPersonId;
+ }
+
+ public String getToPersonEmail() {
+ return toPersonEmail;
+ }
+
+ public void setToPersonEmail(String toPersonEmail) {
+ this.toPersonEmail = toPersonEmail;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public String getMarkdown() {
+ return markdown;
+ }
+
+ public void setMarkdown(String markdown) {
+ this.markdown = markdown;
+ }
+
+ public String getHtml() {
+ return html;
+ }
+
+ public void setHtml(String html) {
+ this.html = html;
+ }
+}
diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsAlertChannel.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsAlertChannel.java
new file mode 100644
index 0000000000..08963cab6a
--- /dev/null
+++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsAlertChannel.java
@@ -0,0 +1,38 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.webexteams;
+
+import org.apache.dolphinscheduler.alert.api.AlertChannel;
+import org.apache.dolphinscheduler.alert.api.AlertData;
+import org.apache.dolphinscheduler.alert.api.AlertInfo;
+import org.apache.dolphinscheduler.alert.api.AlertResult;
+
+import java.util.Map;
+
+public final class WebexTeamsAlertChannel implements AlertChannel {
+ @Override
+ public AlertResult process(AlertInfo alertInfo) {
+ AlertData alertData = alertInfo.getAlertData();
+ Map alertParams = alertInfo.getAlertParams();
+ if (alertParams == null || alertParams.size() == 0) {
+ return new AlertResult("false", "WebexTeams alert params is empty");
+ }
+
+ return new WebexTeamsSender(alertParams).sendWebexTeamsAlter(alertData);
+ }
+}
diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsAlertChannelFactory.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsAlertChannelFactory.java
new file mode 100644
index 0000000000..f17c3cde8f
--- /dev/null
+++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsAlertChannelFactory.java
@@ -0,0 +1,100 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.webexteams;
+
+import org.apache.dolphinscheduler.alert.api.AlertChannel;
+import org.apache.dolphinscheduler.alert.api.AlertChannelFactory;
+import org.apache.dolphinscheduler.spi.params.base.ParamsOptions;
+import org.apache.dolphinscheduler.spi.params.base.PluginParams;
+import org.apache.dolphinscheduler.spi.params.base.Validate;
+import org.apache.dolphinscheduler.spi.params.input.InputParam;
+import org.apache.dolphinscheduler.spi.params.radio.RadioParam;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.auto.service.AutoService;
+
+@AutoService(AlertChannelFactory.class)
+public final class WebexTeamsAlertChannelFactory implements AlertChannelFactory {
+ @Override
+ public String name() {
+ return "WebexTeams";
+ }
+
+ @Override
+ public List params() {
+ List paramsList = new ArrayList<>();
+ InputParam botAccessToken = InputParam.newBuilder(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_BOT_ACCESS_TOKEN, WebexTeamsParamsConstants.WEBEX_TEAMS_BOT_ACCESS_TOKEN)
+ .setPlaceholder("Please enter the robot's access token you were given")
+ .addValidate(Validate.newBuilder()
+ .setRequired(true)
+ .build())
+ .build();
+
+ InputParam roomId = InputParam.newBuilder(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_ROOM_ID, WebexTeamsParamsConstants.WEBEX_TEAMS_ROOM_ID)
+ .setPlaceholder("The room ID of the message")
+ .addValidate(Validate.newBuilder()
+ .setRequired(false)
+ .build())
+ .build();
+
+ InputParam toPersonId = InputParam.newBuilder(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_TO_PERSON_ID, WebexTeamsParamsConstants.WEBEX_TEAMS_TO_PERSON_ID)
+ .setPlaceholder("The person ID of the message recipient")
+ .addValidate(Validate.newBuilder()
+ .setRequired(false)
+ .build())
+ .build();
+
+ InputParam toPersonEmail = InputParam.newBuilder(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_TO_PERSON_EMAIL, WebexTeamsParamsConstants.WEBEX_TEAMS_TO_PERSON_EMAIL)
+ .setPlaceholder("The email address of the message recipient")
+ .addValidate(Validate.newBuilder()
+ .setRequired(false)
+ .build())
+ .build();
+
+ InputParam atSomeoneInRoom = InputParam.newBuilder(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_AT_SOMEONE_IN_ROOM, WebexTeamsParamsConstants.WEBEX_TEAMS_AT_SOMEONE_IN_ROOM)
+ .setPlaceholder("use ,(eng commas) to separate multiple emails")
+ .addValidate(Validate.newBuilder()
+ .setRequired(false)
+ .build())
+ .build();
+
+ RadioParam destination = RadioParam.newBuilder(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_DESTINATION, WebexTeamsParamsConstants.WEBEX_TEAMS_DESTINATION)
+ .addParamsOptions(new ParamsOptions(WebexTeamsDestination.ROOM_ID.getDescp(), WebexTeamsDestination.ROOM_ID.getDescp(), false))
+ .addParamsOptions(new ParamsOptions(WebexTeamsDestination.PERSON_EMAIL.getDescp(), WebexTeamsDestination.PERSON_EMAIL.getDescp(), false))
+ .addParamsOptions(new ParamsOptions(WebexTeamsDestination.PERSON_ID.getDescp(), WebexTeamsDestination.PERSON_ID.getDescp(), false))
+ .setValue(WebexTeamsDestination.ROOM_ID.getDescp())
+ .addValidate(Validate.newBuilder().setRequired(true).build())
+ .build();
+
+ paramsList.add(botAccessToken);
+ paramsList.add(roomId);
+ paramsList.add(toPersonId);
+ paramsList.add(toPersonEmail);
+ paramsList.add(atSomeoneInRoom);
+ paramsList.add(destination);
+
+ return paramsList;
+ }
+
+ @Override
+ public AlertChannel create() {
+ return new WebexTeamsAlertChannel();
+ }
+}
diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsDestination.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsDestination.java
new file mode 100644
index 0000000000..1d23aed591
--- /dev/null
+++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsDestination.java
@@ -0,0 +1,63 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.webexteams;
+
+import static java.util.stream.Collectors.toMap;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import com.google.common.base.Functions;
+
+public enum WebexTeamsDestination {
+ /**
+ * 0 ROOM_ID;
+ * 1 PERSON_EMAIL;
+ * 2 PERSON_ID;
+ */
+ ROOM_ID(0, "roomId"),
+ PERSON_EMAIL(1, "personEmail"),
+ PERSON_ID(2, "personId");
+
+ private final int code;
+ private final String descp;
+
+ WebexTeamsDestination(int code, String descp) {
+ this.code = code;
+ this.descp = descp;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getDescp() {
+ return descp;
+ }
+
+ private static final Map WEBEX_TEAMS_DESTINATION_MAP =
+ Arrays.stream(WebexTeamsDestination.values()).collect(toMap(WebexTeamsDestination::getDescp, Functions.identity()));
+
+ public static WebexTeamsDestination of(String descp) {
+ if (WEBEX_TEAMS_DESTINATION_MAP.containsKey(descp)) {
+ return WEBEX_TEAMS_DESTINATION_MAP.get(descp);
+ }
+
+ return null;
+ }
+}
diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsParamsConstants.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsParamsConstants.java
new file mode 100644
index 0000000000..16ddddae01
--- /dev/null
+++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsParamsConstants.java
@@ -0,0 +1,39 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.webexteams;
+
+public final class WebexTeamsParamsConstants {
+
+ public static final String NAME_WEBEX_TEAMS_BOT_ACCESS_TOKEN = "BotAccessToken";
+ public static final String WEBEX_TEAMS_BOT_ACCESS_TOKEN = "botAccessToken";
+ public static final String NAME_WEBEX_TEAMS_DESTINATION = "Destination";
+ public static final String WEBEX_TEAMS_DESTINATION = "destination";
+ public static final String NAME_WEBEX_TEAMS_TO_PERSON_ID = "ToPersonId";
+ public static final String WEBEX_TEAMS_TO_PERSON_ID = "toPersonId";
+ public static final String NAME_WEBEX_TEAMS_TO_PERSON_EMAIL = "ToPersonEmail";
+ public static final String WEBEX_TEAMS_TO_PERSON_EMAIL = "toPersonEmail";
+ public static final String NAME_WEBEX_TEAMS_ROOM_ID = "RoomId";
+ public static final String WEBEX_TEAMS_ROOM_ID = "roomId";
+ public static final String NAME_WEBEX_TEAMS_AT_SOMEONE_IN_ROOM = "AtSomeoneInRoom";
+ public static final String WEBEX_TEAMS_AT_SOMEONE_IN_ROOM = "atSomeoneInRoom";
+ public static final String WEBEX_TEAMS_API = "https://webexapis.com/v1/messages";
+
+ private WebexTeamsParamsConstants() {
+ throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
+ }
+}
diff --git a/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsSender.java b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsSender.java
new file mode 100644
index 0000000000..7b61696c8f
--- /dev/null
+++ b/dolphinscheduler-alert/dolphinscheduler-alert-plugins/dolphinscheduler-alert-webexteams/src/main/java/org/apache/dolphinscheduler/plugin/alert/webexteams/WebexTeamsSender.java
@@ -0,0 +1,170 @@
+/*
+ * 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.dolphinscheduler.plugin.alert.webexteams;
+
+import org.apache.dolphinscheduler.alert.api.AlertData;
+import org.apache.dolphinscheduler.alert.api.AlertResult;
+import org.apache.dolphinscheduler.spi.utils.JSONUtils;
+
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+import org.slf4j.Logger;
+
+import com.google.common.base.Preconditions;
+
+public final class WebexTeamsSender {
+ private static final Logger log = org.slf4j.LoggerFactory.getLogger(WebexTeamsSender.class);
+
+ private final String botAccessToken;
+ private final String roomId;
+ private final String toPersonId;
+ private final String toPersonEmail;
+ private final String atSomeoneInRoom;
+ private final WebexTeamsDestination destination;
+
+ public WebexTeamsSender(Map config) {
+ botAccessToken = config.get(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_BOT_ACCESS_TOKEN);
+ roomId = config.get(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_ROOM_ID);
+ toPersonId = config.get(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_TO_PERSON_ID);
+ toPersonEmail = config.get(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_TO_PERSON_EMAIL);
+ atSomeoneInRoom = config.get(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_AT_SOMEONE_IN_ROOM);
+ destination = WebexTeamsDestination.of(config.get(WebexTeamsParamsConstants.NAME_WEBEX_TEAMS_DESTINATION));
+ Preconditions.checkArgument(!Objects.isNull(botAccessToken), "WebexTeams bot access token can not be null");
+ Preconditions.checkArgument(!Objects.isNull(destination), "WebexTeams message destination can not be null");
+ Preconditions.checkArgument((!Objects.isNull(roomId) || !Objects.isNull(toPersonId) || !Objects.isNull(toPersonEmail)),"WebexTeams message destination could not be determined. Provide only one destination in the roomId, toPersonEmail, or toPersonId field");
+ }
+
+ public AlertResult sendWebexTeamsAlter(AlertData alertData) {
+ AlertResult alertResult = new AlertResult();
+ alertResult.setStatus("false");
+ alertResult.setMessage("send webex teams alert fail.");
+
+ try {
+ send(alertResult, alertData);
+ } catch (Exception e) {
+ log.info("send webex teams alert exception : {}", e.getMessage());
+ }
+
+ return alertResult;
+ }
+
+ private void send(AlertResult alertResult, AlertData alertData) throws IOException {
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+
+ try {
+ HttpPost httpPost = constructHttpPost(getMessage(alertData), botAccessToken);
+ CloseableHttpResponse response = httpClient.execute(httpPost);
+
+ int statusCode = response.getStatusLine().getStatusCode();
+ try {
+ if (statusCode == HttpStatus.SC_OK) {
+ alertResult.setStatus("true");
+ alertResult.setMessage("send webex teams alert success");
+ } else {
+ log.info("send webex teams alert fail, statusCode : {}", statusCode);
+ }
+ } finally {
+ response.close();
+ }
+ } catch (IOException e) {
+ log.info("send webex teams alert exception : {}", e.getMessage());
+ } finally {
+ httpClient.close();
+ }
+ }
+
+ private WebexMessage getMessage(AlertData alertData) {
+ WebexMessage message = new WebexMessage();
+ String formatContent = formatContent(alertData);
+
+ switch (destination) {
+ case ROOM_ID: {
+ message.setRoomId(roomId);
+ if (!Objects.isNull(atSomeoneInRoom)) {
+ formatContent = addAtPersonEmailInRoom(formatContent, atSomeoneInRoom);
+ }
+ break;
+ }
+ case PERSON_EMAIL: {
+ message.setToPersonEmail(toPersonEmail);
+ break;
+ }
+ case PERSON_ID: {
+ message.setToPersonId(toPersonId);
+ break;
+ }
+ }
+
+ message.setMarkdown(formatContent);
+ return message;
+ }
+
+ private static HttpPost constructHttpPost(WebexMessage message, String botAccessToken) {
+ HttpPost post = new HttpPost(WebexTeamsParamsConstants.WEBEX_TEAMS_API);
+ StringEntity entity = new StringEntity(JSONUtils.toJsonString(message), StandardCharsets.UTF_8);
+ post.setEntity(entity);
+ post.addHeader("Content-Type", "application/json; charset=utf-8");
+ post.addHeader("Authorization", "Bearer " + botAccessToken);
+ return post;
+ }
+
+ public static String addAtPersonEmailInRoom(String formatContent, String atPersonEmailInRoom) {
+ String[] emailArr = atPersonEmailInRoom.split(",");
+ StringBuilder formatContentBuilder = new StringBuilder(formatContent);
+ for (String email: emailArr) {
+ formatContentBuilder.append(" <@personEmail:").append(email).append(">");
+ }
+
+ return formatContentBuilder.toString();
+ }
+
+ public static String formatContent(AlertData alertData) {
+ if (alertData.getContent() != null) {
+ List