Elemar Deckmann 1 vuosi sitten
commit
6d64c761d2

+ 24 - 0
README.md

@@ -0,0 +1,24 @@
+
+# Fluig API: email
+
+## Descrição 
+
+> API de Envio de E-mail
+
+## Compilar
+
+```shell
+nmv clean install
+```
+
+## Instalar
+
+Adicionar o arquivo email.war na central de componentes do Fluig
+
+## Acessar
+
+[scheme://host:port/email/api/endpoint](scheme://host:port/email/api/endpoint)  
+
+---
+
+> Criado em 16 de fevereiro de 2024 às 20:30:15 por [Elemar Deckmann](https://elemar.dev.br)

+ 124 - 0
pom.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.ademicon</groupId>
+  <artifactId>email</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>war</packaging>
+
+  <name>Fluig API: email</name>
+  <description>API de Envio de E-mail [O projeto foi gerado pelo arquétipo Maven 'fluig-archetype-1.0-SNAPSHOT']</description>
+  <licenses>
+    <license>
+      <name>UNLICENSED</name>
+    </license>
+  </licenses>
+
+  <properties>
+    <fluig.version>1.8.1</fluig.version>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <project.report.sourceEncoding>UTF-8</project.report.sourceEncoding>
+    <maven.compiler.release>11</maven.compiler.release>
+    <jakartaee-api.version>8.0.0</jakartaee-api.version>
+    <compiler-plugin.version>3.11.0</compiler-plugin.version>
+    <war-plugin.version>3.3.2</war-plugin.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>com.fluig</groupId>
+      <artifactId>foundation-security-authentication-saml</artifactId>
+      <scope>compile</scope>
+      <version>1.5.13</version>
+    </dependency>
+    
+    <dependency>
+      <groupId>javax.activation</groupId>
+      <artifactId>activation</artifactId>
+      <version>1.1.1</version>
+  </dependency>
+  
+
+    <dependency>
+      <groupId>com.fluig</groupId>
+      <artifactId>fluig-sdk-api</artifactId>
+      <version>${fluig.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fluig</groupId>
+      <artifactId>fluig-sdk-common</artifactId>
+      <version>${fluig.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>jakarta.platform</groupId>
+      <artifactId>jakarta.jakartaee-api</artifactId>
+      <version>${jakartaee-api.version}</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.11</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+      <version>1.18.30</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.swagger.core.v3</groupId>
+      <artifactId>swagger-annotations</artifactId>
+      <version>2.2.20</version>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-core</artifactId>
+      <version>2.16.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>2.16.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>commons-dbutils</groupId>
+      <artifactId>commons-dbutils</artifactId>
+      <version>1.8.1</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <finalName>email</finalName>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>${compiler-plugin.version}</version>
+      </plugin>
+      <plugin>
+        <artifactId>maven-war-plugin</artifactId>
+        <version>${war-plugin.version}</version>
+        <configuration>
+          <failOnMissingWebXml>false</failOnMissingWebXml>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+  <repositories>
+    <repository>
+      <id>fluig</id>
+      <name>Fluig Nexus Repository</name>
+      <url>https://nexus.fluig.com/repository/fluig/</url>
+    </repository>
+  </repositories>
+</project>

+ 8 - 0
src/main/java/com/ademicon/config/ApplicationConfig.java

@@ -0,0 +1,8 @@
+package com.ademicon.config;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+
+@ApplicationPath("/api")
+public class ApplicationConfig extends Application {    
+}

+ 49 - 0
src/main/java/com/ademicon/controller/EmailController.java

@@ -0,0 +1,49 @@
+package com.ademicon.controller;
+
+import java.io.IOException;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import com.ademicon.model.Email;
+import com.ademicon.service.EmailService;
+
+@Path("/send")
+public class EmailController {
+
+    private static EmailService emailService = new EmailService();
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/")
+    public Response getUser() {
+        try {
+            return Response.ok("{user:ok}").build();
+        } catch (Exception e) {
+            return Response.status(Status.INTERNAL_SERVER_ERROR).entity(e).build();
+        }
+    }
+
+    @Path("/")
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response doPost(Email email) throws Exception {
+        try {
+            emailService.sendmail(email);
+            return Response.ok().build();
+
+        } catch (IOException e) {
+            System.out.println("ERRO EMAIL");
+            e.printStackTrace();
+            return Response.status(500).entity(e).build();
+        }
+    }
+
+}

+ 26 - 0
src/main/java/com/ademicon/model/Email.java

@@ -0,0 +1,26 @@
+package com.ademicon.model;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Email implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String to;
+    private List<String> cc;
+    private List<String> cco;
+    private String message;
+    private String subject;
+    private String template;
+    private HashMap<String, String> attachments;
+
+}

+ 127 - 0
src/main/java/com/ademicon/service/EmailService.java

@@ -0,0 +1,127 @@
+package com.ademicon.service;
+
+import java.util.Base64;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.PasswordAuthentication;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import com.ademicon.model.Email;
+
+public class EmailService {
+
+    final String username = "prosegnews@conseg.com.br";
+    final String password = "Ademicon#2024";
+
+    public void sendmail(Email email) throws Exception {
+        Properties props = new Properties();
+        props.setProperty("mail.smtp.starttls.enable", "true");
+        props.setProperty("mail.smtp.auth", "true");
+        props.setProperty("mail.smtp.starttls.enable", "true");
+        props.setProperty("mail.smtp.host", "smtp.office365.com");
+        props.setProperty("mail.smtp.port", "587");
+        props.setProperty("mail.smtp.ssl.trust", "smtp.office365.com");
+
+        Session session = Session.getInstance(props,
+                new javax.mail.Authenticator() {
+                    protected PasswordAuthentication getPasswordAuthentication() {
+                        return new PasswordAuthentication(username, password);
+                    }
+                });
+
+        Transport transport = session.getTransport();
+
+        try {
+
+            Message message = new MimeMessage(session);
+            MimeBodyPart messageBodyPart = new MimeBodyPart();
+            MimeMultipart multipart = new MimeMultipart("mixed");
+
+            // Define o e-mail e nome do remetente
+            message.setFrom(new javax.mail.internet.InternetAddress("prosegnews@conseg.com.br", "Ademicon"));
+
+            // Seta o assunto do e-mail
+            message.setSubject(email.getSubject());
+
+            // Adiciona o destinatário principal
+            message.addRecipient(
+                    javax.mail.Message.RecipientType.TO,
+                    new javax.mail.internet.InternetAddress(email.getTo()));
+
+            // Seta os destinatários que receberão uma cópia do e-mail
+            if (!email.getCc().isEmpty()) {
+                List<String> c = email.getCc();
+                for (String cString : c) {
+                    message.addRecipient(
+                            javax.mail.Message.RecipientType.CC,
+                            new javax.mail.internet.InternetAddress(cString));
+
+                }
+            }
+
+            // Seta os destinatários que receberão uma cópia oculta
+            if (!email.getCco().isEmpty()) {
+                List<String> cco = email.getCco();
+                for (String c : cco) {
+                    message.addRecipient(
+                            javax.mail.Message.RecipientType.BCC,
+                            new javax.mail.internet.InternetAddress(c));
+
+                }
+            }
+
+            // Seta o conteúdo do corpo do e-mail e sua codificação
+            if (!email.getTemplate().isEmpty()) {
+                byte[] decodedBytes = Base64.getDecoder().decode(email.getTemplate());
+                String template = new String(decodedBytes);
+                messageBodyPart.setContent(template, "text/html; charset=utf-8");
+            } else {
+                messageBodyPart.setContent(email.getMessage(), "text/plain; charset=utf-8");
+            }
+
+            // Adiciona os anexos que serão enviados no e-mail
+            if (!email.getAttachments().isEmpty()) {
+                Map<String, String> attachments = email.getAttachments();
+                for (Map.Entry<String, String> set : attachments.entrySet()) {
+                    var byteArray = java.util.Base64.getDecoder().decode(new String(set.getValue()));
+                    var attachment = new javax.mail.internet.MimeBodyPart();
+                    attachment.setDataHandler(new javax.activation.DataHandler(
+                            new javax.mail.util.ByteArrayDataSource(byteArray, "application/octet-stream")));
+                    attachment.setDisposition(javax.mail.internet.MimeBodyPart.ATTACHMENT);
+                    attachment.setFileName(set.getKey());
+                    multipart.addBodyPart(attachment);
+
+                }
+            }
+
+            multipart.addBodyPart(messageBodyPart);
+            message.setContent(multipart);
+
+            // Método para se autenticar ao servidor
+            transport.connect();
+
+            // Método para enviar a mensagem criada
+            System.out.println("Sending");
+            transport.sendMessage(message, message.getAllRecipients());
+            System.out.println("Done");
+
+        } catch (MessagingException e) {
+            System.out.println("Fail");
+            System.out.println("ERRO EMAIL ENVIO");
+            e.printStackTrace();
+            throw new Exception("Falha ao enviar e-mail de faturamento para " + email.getTo());
+        } finally {
+            transport.close();
+        }
+
+    }
+
+}

+ 19 - 0
src/main/resources/application.info

@@ -0,0 +1,19 @@
+application.type=widget
+application.code=email
+application.title=email
+application.description=API de Envio de E-mail
+application.icon=/resources/images/icon.png
+application.fluig.version=null
+application.category=API
+application.renderer=freemarker
+developer.code=elemar
+developer.name=Elemar Deckmann
+developer.url=https://elemar.dev.br
+application.uiwidget=false
+application.mobileapp=false
+application.version=1.0-SNAPSHOT
+view.file=view.ftl
+edit.file=edit.ftl
+locale.file.base.name=email
+application.resource.js.1=/resources/js/email.js
+application.resource.css.2=/resources/css/email.css

+ 4 - 0
src/main/resources/edit.ftl

@@ -0,0 +1,4 @@
+<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide" data-params="MyWidget.instance()">
+
+</div>
+

+ 0 - 0
src/main/resources/email.properties


+ 0 - 0
src/main/resources/email_en_US.properties


+ 0 - 0
src/main/resources/email_es.properties


+ 0 - 0
src/main/resources/email_pt_BR.properties


+ 4 - 0
src/main/resources/view.ftl

@@ -0,0 +1,4 @@
+<div id="MyWidget_${instanceId}" class="super-widget wcm-widget-class fluig-style-guide"
+        data-params="MyWidget.instance()">
+        
+    </div>

+ 25 - 0
src/main/webapp/WEB-INF/jboss-web.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jboss-web>
+    <context-root>/email</context-root>
+    <disable-cross-context>false</disable-cross-context>
+    <!-- <security-domain>TOTVSTech</security-domain>
+    <security-role>
+        <role-name>user</role-name>
+        <principal-name>totvstech</principal-name>
+    </security-role>
+    <security-role>
+        <role-name>totvstech</role-name>
+        <principal-name>totvstech</principal-name>
+    </security-role>
+    <security-role>
+        <role-name>sysadmin</role-name>
+        <principal-name>wcmadmin</principal-name>
+    </security-role>
+    <security-role>
+        <role-name>admin</role-name>
+        <principal-name>wcmadmin</principal-name>
+    </security-role> 
+    <valve>
+        <class-name>com.totvs.technology.auth.saml.TOTVSAuthenticatorValve</class-name>
+    </valve> -->
+</jboss-web>

+ 36 - 0
src/main/webapp/WEB-INF/web.xml

@@ -0,0 +1,36 @@
+<web-app version="4.0"
+	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd">
+
+    <!-- <security-constraint>
+        <display-name>REST</display-name>
+        <web-resource-collection>
+            <web-resource-name>REST</web-resource-name>
+            <description>REST</description>
+            <url-pattern>/api/*</url-pattern>
+        </web-resource-collection>
+        <auth-constraint>
+            <description>REST</description>
+            <role-name>user</role-name>
+        </auth-constraint>
+    </security-constraint>
+    <login-config>
+        <auth-method>FORM,FLUIGAUTH</auth-method>
+        <realm-name>TOTVSTech</realm-name>
+        <form-login-config>
+            <form-login-page>/login.jsp</form-login-page>
+            <form-error-page>/loginfail.jsp</form-error-page>
+        </form-login-config>
+    </login-config>
+  
+    <security-role>
+        <role-name>totvstech</role-name>
+    </security-role>
+    <security-role>
+        <role-name>user</role-name>
+    </security-role>
+    <security-role>
+        <role-name>sysadmin</role-name>
+    </security-role> -->
+</web-app>

+ 0 - 0
src/main/webapp/resources/css/email.css


BIN
src/main/webapp/resources/images/icon.png


+ 0 - 0
src/main/webapp/resources/js/email.js


+ 20 - 0
src/test/java/com/ademicon/AppTest.java

@@ -0,0 +1,20 @@
+package com.ademicon;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+{
+    /**
+     * Rigorous Test :-)
+     */
+    @Test
+    public void shouldAnswerWithTrue()
+    {
+        assertTrue( true );
+    }
+}