Merge branch 'DEVELOP'
diff --git a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/config/EmailConfig.java b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/config/EmailConfig.java
index 752926f..fb60c2f 100644
--- a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/config/EmailConfig.java
+++ b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/config/EmailConfig.java
@@ -33,4 +33,9 @@
@Value("${email.port:1025}")
private String emailPort;
+ @Value("${email.isHtmlEmail:true}")
+ private boolean isHtmlEmail;
+
+ @Value("${email.isUseHtmlEmailTemplate:true}")
+ private boolean isUseHtmlEmailTemplate;
}
diff --git a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/email/Email.java b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/email/Email.java
index b168cdd..df1623c 100644
--- a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/email/Email.java
+++ b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/email/Email.java
@@ -24,7 +24,11 @@
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
-import java.util.*;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -42,18 +46,24 @@
private final Properties props = new Properties();
private final MimeMultipart multipart = new MimeMultipart();
private final MimeMessage message;
+ private final boolean htmlMail;
- public Email(String smtpHost, String port) {
+ public Email(String smtpHost, String port, boolean htmlMail) {
props.put("mail.smtp.auth", "false");
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", port);
+ this.htmlMail = htmlMail;
Session session = Session.getInstance(props);
message = new MimeMessage(session);
}
public void addText(String text) throws MessagingException {
MimeBodyPart textBody = new MimeBodyPart();
+ if (htmlMail) {
+ textBody.setText(text, MAIL_ENCODING, "html");
+ } else {
textBody.setText(text, MAIL_ENCODING);
+ }
textBody.setDisposition(INLINE);
multipart.addBodyPart(textBody);
}
diff --git a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/email/GfiEmail.java b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/email/GfiEmail.java
index 4424432..c30e1d8 100644
--- a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/email/GfiEmail.java
+++ b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/email/GfiEmail.java
@@ -29,7 +29,7 @@
protected String emailBody;
public GfiEmail(EmailConfig emailConfig) throws MessagingException {
- email = new Email(emailConfig.getSmtpHost(), emailConfig.getEmailPort());
+ email = new Email(emailConfig.getSmtpHost(), emailConfig.getEmailPort(), emailConfig.isHtmlEmail());
email.setFrom(emailConfig.getSender());
}
diff --git a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/service/EmailService.java b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/service/EmailService.java
index 62498f3..c998b3f 100644
--- a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/service/EmailService.java
+++ b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/service/EmailService.java
@@ -18,10 +18,13 @@
import org.eclipse.openk.gridfailureinformation.mailexport.config.EmailConfig;
import org.eclipse.openk.gridfailureinformation.mailexport.dtos.MailMessageDto;
import org.eclipse.openk.gridfailureinformation.mailexport.email.GfiEmail;
+import org.eclipse.openk.gridfailureinformation.mailexport.util.ResourceLoaderBase;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
@@ -29,12 +32,19 @@
@Service
public class EmailService {
+ public static final String DATE_PATTERN = "dd.MM.yyyy, HH:mm:ss";
+
+ public static final String TEMPLATE_EMAIL_CONTENT_PLACEHOLDER = "##EMAIL_CONTENT_PLACEHOLDER###";
+ public static final String EMAIL_CREATION_SENT_DATE_PLACEHOLDER = "##CREATION_SENT_DATE###";
+
+ public static final String EMAIL_TEMPLATE_PATH = "emails/emailTemplate.html";
+
@Autowired
EmailConfig emailConfig;
public void sendMail(MailMessageDto mailMessageDto) throws MessagingException {
GfiEmail gfiEmail = new GfiEmail(emailConfig);
- gfiEmail.setEmailContent(mailMessageDto.getEmailSubject(), mailMessageDto.getBody());
+ gfiEmail.setEmailContent(mailMessageDto.getEmailSubject(), useHtmlEmailTemplate(mailMessageDto.getBody()));
gfiEmail.setRecipientsTo(mailMessageDto.getMailAddresses());
gfiEmail.sendEmail();
}
@@ -43,9 +53,23 @@
GfiEmail gfiEmail = new GfiEmail(emailConfig);
List<String> mailAddressList = new ArrayList<>();
mailAddressList.add(recipient);
- gfiEmail.setEmailContent("Test Betreff", "Email Text Inhalt Test");
+ gfiEmail.setEmailContent("Test Betreff", useHtmlEmailTemplate("Email Text Inhalt Test"));
gfiEmail.setRecipientsTo(mailAddressList);
gfiEmail.sendEmail();
}
+ private String useHtmlEmailTemplate(String emailText) {
+ if (!emailConfig.isHtmlEmail() || !emailConfig.isUseHtmlEmailTemplate()) {
+ return emailText;
+ }
+
+ String htmlEmailTemplate = new ResourceLoaderBase().loadStringFromResource(EMAIL_TEMPLATE_PATH);
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_PATTERN);
+ String nowDateString = LocalDateTime.now().format(dateTimeFormatter);
+ htmlEmailTemplate = htmlEmailTemplate.replace(EMAIL_CREATION_SENT_DATE_PLACEHOLDER, nowDateString);
+ return htmlEmailTemplate.replace(TEMPLATE_EMAIL_CONTENT_PLACEHOLDER, emailText);
+ }
+
+
+
}
diff --git a/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/util/ResourceLoaderBase.java b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/util/ResourceLoaderBase.java
new file mode 100644
index 0000000..e341217
--- /dev/null
+++ b/mailExport/src/main/java/org/eclipse/openk/gridfailureinformation/mailexport/util/ResourceLoaderBase.java
@@ -0,0 +1,86 @@
+/*
+ *******************************************************************************
+ * Copyright (c) 2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************
+*/
+
+package org.eclipse.openk.gridfailureinformation.mailexport.util;
+
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.io.ByteOrderMark;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.input.BOMInputStream;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+@Log4j2
+public class ResourceLoaderBase {
+
+ private String stream2String(InputStream is, String filename) {
+ StringWriter writer = new StringWriter();
+ BOMInputStream bomInputStream = new BOMInputStream(is, false, ByteOrderMark.UTF_8, ByteOrderMark.UTF_16BE, ByteOrderMark.UTF_16LE,
+ ByteOrderMark.UTF_32BE, ByteOrderMark.UTF_32LE);
+
+ try {
+ IOUtils.copy(bomInputStream, writer, StandardCharsets.UTF_8.name());
+ } catch (IOException e) {
+ log.error("Fehler in stream2String()", e);
+ return "";
+ }
+
+ log.debug("Datei erfolgreich eingelesen: " + filename);
+ return writer.toString();
+ }
+
+ public String loadStringFromResource(String filename) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ InputStream inputStream = classLoader.getResourceAsStream(filename);
+ if (inputStream==null){
+ log.error("Datei nicht gefunden: " + filename);
+ return null;
+ }
+ log.debug("Datei existiert: " + filename);
+ try {
+ URL resource = classLoader.getResource(filename);
+ if (resource != null) {
+ URI uri = resource.toURI();
+ log.debug("Uniform Resource Identifier (URI): " + uri);
+ }
+ } catch (URISyntaxException e) {
+ log.error("Fehler in loadStringFromResource: " + filename, e);
+ }
+
+ return stream2String(inputStream, filename);
+ }
+
+ public String loadFromPath(String path) {
+ try {
+ Path paths = Paths.get(path);
+ log.debug("paths: " + path);
+ try (InputStream inputStream = Files.newInputStream(Paths.get(path))) {
+ return stream2String(inputStream, paths.getFileName().toString());
+ }
+ } catch (IOException e) {
+ log.error("Fehler in loadFromPath", e);
+ return null;
+ }
+ }
+}
diff --git a/mailExport/src/main/resources/application.yml b/mailExport/src/main/resources/application.yml
index a54a58a..9c7231e 100644
--- a/mailExport/src/main/resources/application.yml
+++ b/mailExport/src/main/resources/application.yml
@@ -27,6 +27,8 @@
sender: sender@test.tester
smtpHost: entdockergss
port: 1025
+ isHtmlEmail: true
+ isUseHtmlEmailTemplate: true
security.endpoint:
user: ${GFI_MANUAL_ENDPOINTS_USERNAME}
diff --git a/mailExport/src/main/resources/application_localdev.yml b/mailExport/src/main/resources/application_localdev.yml
index c635529..a37beec 100644
--- a/mailExport/src/main/resources/application_localdev.yml
+++ b/mailExport/src/main/resources/application_localdev.yml
@@ -39,6 +39,8 @@
sender: sender@olaf.senderson
smtpHost: entdockergss
port: 1025
+ isHtmlEmail: true
+ isUseHtmlEmailTemplate: true
security.endpoint:
user: ${GFI_MANUAL_ENDPOINTS_USERNAME}
diff --git a/mailExport/src/main/resources/emails/emailTemplate.html b/mailExport/src/main/resources/emails/emailTemplate.html
new file mode 100644
index 0000000..1d2e03c
--- /dev/null
+++ b/mailExport/src/main/resources/emails/emailTemplate.html
@@ -0,0 +1,176 @@
+<!--
+*******************************************************************************
+* Copyright (c) 2018 Contributors to the Eclipse Foundation
+*
+* See the NOTICE file(s) distributed with this work for additional
+* information regarding copyright ownership.
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v. 2.0 which is available at
+* http://www.eclipse.org/legal/epl-2.0.
+*
+* SPDX-License-Identifier: EPL-2.0
+*******************************************************************************
+-->
+<!doctype html>
+<html>
+ <head>
+ <meta name="viewport" content="width=device-width">
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>open KONSEQUENZ Email</title>
+ <style>
+@media only screen and (max-width: 580px) {
+ table[class=body] h1 {
+ font-size: 28px !important;
+ margin-bottom: 10px !important;
+ }
+
+ table[class=body] p,
+table[class=body] ul,
+table[class=body] ol,
+table[class=body] td,
+table[class=body] span,
+table[class=body] a {
+ font-size: 16px !important;
+ }
+
+ table[class=body] .wrapper,
+table[class=body] .article {
+ padding: 10px !important;
+ }
+
+ table[class=body] .content {
+ padding: 0 !important;
+ }
+
+ table[class=body] .container {
+ padding: 0 !important;
+ width: 100% !important;
+ }
+
+ table[class=body] .main {
+ border-left-width: 0 !important;
+ border-radius: 0 !important;
+ border-right-width: 0 !important;
+ }
+
+ table[class=body] .btn table {
+ width: 100% !important;
+ }
+
+ table[class=body] .btn a {
+ width: 100% !important;
+ }
+
+ table[class=body] .img-responsive {
+ height: auto !important;
+ max-width: 100% !important;
+ width: auto !important;
+ }
+}
+@media all {
+ .ExternalClass {
+ width: 100%;
+ }
+
+ .ExternalClass,
+.ExternalClass p,
+.ExternalClass span,
+.ExternalClass font,
+.ExternalClass td,
+.ExternalClass div {
+ line-height: 100%;
+ }
+
+ .apple-link a {
+ color: inherit !important;
+ font-family: inherit !important;
+ font-size: inherit !important;
+ font-weight: inherit !important;
+ line-height: inherit !important;
+ text-decoration: none !important;
+ }
+
+ #MessageViewBody a {
+ color: inherit;
+ text-decoration: none;
+ font-size: inherit;
+ font-family: inherit;
+ font-weight: inherit;
+ line-height: inherit;
+ }
+
+ .btn-primary table td:hover {
+ background-color: #286090 !important;
+ }
+
+ .btn-primary a:hover {
+ background-color: #286090 !important;
+ border-color: #204d74 !important;
+ }
+}
+</style>
+ </head>
+ <body class="" style="background-color: #f6f6f6; font-family: sans-serif; -webkit-font-smoothing: antialiased; font-size: 14px; line-height: 1.4; margin: 0; padding: 0; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;">
+ <span class="preheader" style="color: transparent; display: none; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">This is preheader text. Some clients will show this text as a preview.</span>
+ <table border="0" cellpadding="0" cellspacing="0" class="body" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; background-color: #f6f6f6;">
+ <tr>
+ <td style="font-family: sans-serif; font-size: 14px; vertical-align: top;"> </td>
+ <td class="container" style="font-family: sans-serif; font-size: 14px; vertical-align: top; display: block; Margin: 0 auto; max-width: 680px; padding: 10px; width: 680px;">
+ <div class="content" style="overflow: auto; position: inherit; box-sizing: border-box; display: block; Margin: 0 auto; max-width: 680px; padding: 10px;">
+
+ <!-- START CENTERED WHITE CONTAINER -->
+ <table class="main" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; background: #ffffff; border-radius: 3px;">
+
+ <div style="padding: 3px; border: 0; background: rgb(232, 238, 231); background: -moz-linear-gradient(left, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(232, 238, 231, 1)), color-stop(75%, rgba(229, 237, 242, 1))); background: -webkit-linear-gradient(left, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); background: -o-linear-gradient(left, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); background: -ms-linear-gradient(left, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); background: linear-gradient(to right, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e8eee7', endColorstr='#e5edf2', GradientType=1);">
+ <span style="margin-left: 6px; font-size: 2em; color: #000; font-weight: 500; text-transform: lowercase;">Open</span>
+ <span style="margin-left: 3px; font-size: 1.5em; color: #000; text-transform: uppercase; font-weight: 300;">Konsequenz</span>
+ </div>
+ <div style="position: relative; height: 4px; width: 100%; background: rgb(121, 182, 28); background: -moz-linear-gradient(left, rgba(121, 182, 28, 1) 0%, rgba(2, 129, 196, 1) 75%); background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(121, 182, 28, 1)), color-stop(75%, rgba(2, 129, 196, 1))); background: -webkit-linear-gradient(left, rgba(121, 182, 28, 1) 0%, rgba(2, 129, 196, 1) 75%); background: -o-linear-gradient(left, rgba(121, 182, 28, 1) 0%, rgba(2, 129, 196, 1) 75%); background: -ms-linear-gradient(left, rgba(121, 182, 28, 1) 0%, rgba(2, 129, 196, 1) 75%); background: linear-gradient(to right, rgba(121, 182, 28, 1) 0%, rgba(2, 129, 196, 1) 75%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#79b61c', endColorstr='#0281c4', GradientType=1);"></div>
+ <div style="border: 0; background: rgb(232, 238, 231); background: -moz-linear-gradient(left, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(232, 238, 231, 1)), color-stop(75%, rgba(229, 237, 242, 1))); background: -webkit-linear-gradient(left, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); background: -o-linear-gradient(left, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); background: -ms-linear-gradient(left, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); background: linear-gradient(to right, rgba(232, 238, 231, 1) 0%, rgba(229, 237, 242, 1) 75%); filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e8eee7', endColorstr='#e5edf2', GradientType=1); padding: 6px 20px;">
+ <span style="font-size: 2.2em; color: #000; font-weight: 300;">Störungsinformationstool</span>
+ </div>
+
+
+ <!-- START MAIN CONTENT AREA -->
+ <tr>
+ <td class="wrapper" style="font-family: sans-serif; font-size: 14px; vertical-align: top; box-sizing: border-box; padding: 20px;">
+ <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;">
+ <tr>
+ <td style="font-family: sans-serif; font-size: 14px; vertical-align: top;">
+ ##EMAIL_CONTENT_PLACEHOLDER###
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <!-- END MAIN CONTENT AREA -->
+ </table>
+
+ <!-- START FOOTER -->
+ <div class="footer" style="clear: both; Margin-top: 10px; text-align: center; width: 100%;">
+ <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;">
+ <tr>
+ <td class="content-block" style="font-family: sans-serif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; font-size: 12px; color: #999999; text-align: center;">
+ <span class="apple-link" style="color: #999999; font-size: 12px; text-align: center;">Automatisierte Mail wurde erstellt und versendet am:</span>
+ <br> ##CREATION_SENT_DATE###
+ </td>
+ </tr>
+ <tr>
+ <td class="content-block powered-by" style="font-family: sans-serif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; font-size: 12px; color: #999999; text-align: center;">
+ Powered by <a href="https://www.openkonsequenz.de/" style="color: #999999; font-size: 12px; text-align: center; text-decoration: none;">openKONSEQUENZ</a>.
+ </td>
+ </tr>
+ </table>
+ </div>
+ <!-- END FOOTER -->
+
+ <!-- END CENTERED WHITE CONTAINER -->
+ </div>
+ </td>
+ <td style="font-family: sans-serif; font-size: 14px; vertical-align: top;"> </td>
+ </tr>
+ </table>
+ </body>
+</html>
\ No newline at end of file