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;">&nbsp;</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;">&nbsp;</td>
+      </tr>
+    </table>
+  </body>
+</html>
\ No newline at end of file