Emails with Spring
authorGustavo Martin Morcuende <gu.martinm@gmail.com>
Fri, 11 Mar 2016 02:46:12 +0000 (03:46 +0100)
committerGustavo Martin Morcuende <gu.martinm@gmail.com>
Fri, 11 Mar 2016 02:46:12 +0000 (03:46 +0100)
SpringJava/Emails/pom.xml [new file with mode: 0644]
SpringJava/Emails/src/main/java/de/spring/emails/services/EmailNotificationService.java [new file with mode: 0644]
SpringJava/Emails/src/main/java/de/spring/emails/services/impl/EmailNotificationServiceImpl.java [new file with mode: 0644]
SpringJava/Emails/src/main/resources/spring-configuration/spring-configuration.xml [new file with mode: 0644]
SpringJava/Emails/src/main/resources/templates/email-template.vm [new file with mode: 0644]

diff --git a/SpringJava/Emails/pom.xml b/SpringJava/Emails/pom.xml
new file mode 100644 (file)
index 0000000..0a8ea1d
--- /dev/null
@@ -0,0 +1,220 @@
+<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/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <groupId>de.spring.emails</groupId>
+       <artifactId>emails-spring</artifactId>
+       <version>1.0-SNAPSHOT</version>
+       <name>emails-spring</name>
+       <url>http://gumartinm.name</url>
+       <description>Sending emails with Spring Framework</description>
+       <organization>
+               <name>Gustavo Martin Morcuende</name>
+               <url>http://www.gumartinm.name</url>
+       </organization>
+       <scm>
+               <developerConnection>scm:git:http://git.gumartinm.name/SpringJava/Emails</developerConnection>
+               <url>http://git.gumartinm.name/SpringJava/Emails</url>
+       </scm>
+
+       <properties>
+               <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+               <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+               <spring.version>4.2.5.RELEASE</spring.version>
+       </properties>
+
+       <profiles>
+               <profile>
+                       <id>release</id>
+                       <properties>
+                               <environment.profile>release</environment.profile>
+                       </properties>
+                       <activation>
+                               <activeByDefault>true</activeByDefault>
+                       </activation>
+               </profile>
+       </profiles>
+
+       <dependencies>
+               <!-- 1/3 Required dependency for log4j 2 with slf4j: binding between log4j 
+                       2 and slf4j -->
+               <dependency>
+                       <groupId>org.apache.logging.log4j</groupId>
+                       <artifactId>log4j-slf4j-impl</artifactId>
+                       <version>2.3</version>
+               </dependency>
+               <!-- 2/3 Required dependency for log4j 2 with slf4j: log4j 2 maven plugin 
+                       (it is the log4j 2 implementation) -->
+               <dependency>
+                       <groupId>org.apache.logging.log4j</groupId>
+                       <artifactId>log4j-core</artifactId>
+                       <version>2.3</version>
+               </dependency>
+               <!-- 3/3 Required dependency for getting rid of commons logging. This is 
+                       the BRIDGE (no binding) between Jakarta Commons Logging (used by Spring) 
+                       and whatever I am using for logging (in this case I am using log4j 2) See: 
+                       http://www.slf4j.org/legacy.html We need exclusions in every dependency using 
+                       Jakarta Commons Logging (see Spring dependencies below) -->
+               <dependency>
+                       <groupId>org.slf4j</groupId>
+                       <artifactId>jcl-over-slf4j</artifactId>
+                       <version>1.7.12</version>
+               </dependency>
+               <dependency>
+                       <groupId>cglib</groupId>
+                       <artifactId>cglib</artifactId>
+                       <version>2.2.2</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.springframework</groupId>
+                       <artifactId>spring-context</artifactId>
+                       <version>${spring.version}</version>
+                       <!-- Required dependency for getting rid of commons logging and use my 
+                               own logging library (in my case I decided to use log4j 2 under slf4j) -->
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>commons-logging</groupId>
+                                       <artifactId>commons-logging</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+
+               <!-- Required dependency for VelocityEngineUtils -->
+               <dependency>
+                       <groupId>org.springframework</groupId>
+                       <artifactId>spring-context-support</artifactId>
+                       <version>${spring.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.velocity</groupId>
+                       <artifactId>velocity</artifactId>
+                       <version>1.7</version>
+               </dependency>
+               <dependency>
+                   <groupId>velocity-tools</groupId>
+                   <artifactId>velocity-tools</artifactId>
+                   <version>2.0-beta1</version>
+               </dependency>
+               
+               <!-- Required dependencies for SMTP client -->
+               <dependency>
+                       <groupId>javax.mail</groupId>
+                       <artifactId>mail</artifactId>
+                       <version>1.5.0-b01</version>
+               </dependency>
+               <dependency>
+                   <groupId>javax.activation</groupId>
+                   <artifactId>activation</artifactId>
+                   <version>1.1.1</version>
+               </dependency>
+
+               <!-- Unitary and integration tests -->
+               <dependency>
+                       <groupId>junit</groupId>
+                       <artifactId>junit</artifactId>
+                       <version>4.12</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.springframework</groupId>
+                       <artifactId>spring-test</artifactId>
+                       <version>${spring.version}</version>
+                       <scope>test</scope>
+                       <!-- Required dependency for getting rid of commons logging and use my 
+                               own logging library (in my case I decided to use log4j 2 under slf4j) -->
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>commons-logging</groupId>
+                                       <artifactId>commons-logging</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+               <dependency>
+                       <groupId>org.mockito</groupId>
+                       <artifactId>mockito-core</artifactId>
+                       <version>2.0.43-beta</version>
+                       <scope>test</scope>
+               </dependency>
+       </dependencies>
+
+       <build>
+
+               <pluginManagement>
+                       <plugins>
+                               <plugin>
+                                       <groupId>org.apache.maven.plugins</groupId>
+                                       <artifactId>maven-surefire-plugin</artifactId>
+                                       <version>2.19.1</version>
+                               </plugin>
+                               <plugin>
+                                       <groupId>org.apache.maven.plugins</groupId>
+                                       <artifactId>maven-failsafe-plugin</artifactId>
+                                       <version>2.19.1</version>
+                               </plugin>
+                       </plugins>
+               </pluginManagement>
+
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-compiler-plugin</artifactId>
+                               <version>3.5.1</version>
+                               <configuration>
+                                       <source>1.8</source>
+                                       <target>1.8</target>
+                                       <encoding>${project.build.sourceEncoding}</encoding>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-resources-plugin</artifactId>
+                               <version>2.7</version>
+                               <configuration>
+                                       <encoding>${project.build.sourceEncoding}</encoding>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-jar-plugin</artifactId>
+                               <version>2.6</version>
+                               <configuration>
+                                       <archive>
+                                               <manifestEntries>
+                                                       <Specification-Title>${project.description}</Specification-Title>
+                                                       <Specification-Version>${project.version}</Specification-Version>
+                                                       <Specification-Vendor>${project.organization.name}</Specification-Vendor>
+                                                       <Implementation-Title>${project.description}</Implementation-Title>
+                                                       <Implementation-Version>${project.version}</Implementation-Version>
+                                                       <Implementation-Vendor>${project.organization.name}</Implementation-Vendor>
+                                               </manifestEntries>
+                                       </archive>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               <configuration>
+                                       <excludes>
+                                               <exclude>**/*IntegrationTest.java</exclude>
+                                       </excludes>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-failsafe-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <goals>
+                                                       <goal>integration-test</goal>
+                                                       <goal>verify</goal>
+                                               </goals>
+                                       </execution>
+                               </executions>
+                               <configuration>
+                                       <includes>
+                                               <include>**/*IntegrationTest.java</include>
+                                       </includes>
+                               </configuration>
+                       </plugin>
+               </plugins>
+       </build>
+</project>
diff --git a/SpringJava/Emails/src/main/java/de/spring/emails/services/EmailNotificationService.java b/SpringJava/Emails/src/main/java/de/spring/emails/services/EmailNotificationService.java
new file mode 100644 (file)
index 0000000..a7643da
--- /dev/null
@@ -0,0 +1,7 @@
+package de.spring.emails.services;
+
+
+public interface EmailNotificationService {
+
+       public void sendEmail();
+}
diff --git a/SpringJava/Emails/src/main/java/de/spring/emails/services/impl/EmailNotificationServiceImpl.java b/SpringJava/Emails/src/main/java/de/spring/emails/services/impl/EmailNotificationServiceImpl.java
new file mode 100644 (file)
index 0000000..9223cd5
--- /dev/null
@@ -0,0 +1,54 @@
+package de.spring.emails.services.impl;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+import org.apache.velocity.app.VelocityEngine;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.MimeMessageHelper;
+import org.springframework.mail.javamail.MimeMessagePreparator;
+import org.springframework.ui.velocity.VelocityEngineUtils;
+
+import de.spring.emails.services.EmailNotificationService;
+
+public class EmailNotificationServiceImpl implements EmailNotificationService {
+       private final JavaMailSender mailSender;
+    private final VelocityEngine velocityEngine;
+       
+    public EmailNotificationServiceImpl(JavaMailSender mailSender, VelocityEngine velocityEngine) {
+       this.mailSender = mailSender;
+       this.velocityEngine = velocityEngine;
+    }
+    
+       @Override
+       public void sendEmail() {
+             final MimeMessagePreparator preparator = new MimeMessagePreparator() {
+                 
+                 public void prepare(MimeMessage mimeMessage) throws Exception {
+                         final MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
+                         message.setTo("toemail@example.com");
+                         message.setBcc("bccemail@example.com");
+                         message.setFrom(new InternetAddress("fromemail@example.com") );
+                         message.setSubject("New funny alert");
+
+                         final LocalDateTime dateTime = LocalDateTime.now();
+                         message.setSentDate(Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()));
+                         Map model = new HashMap<>();               
+                         model.put("newMessage", "");
+                            
+                         final String text = VelocityEngineUtils.mergeTemplateIntoString(
+                                         velocityEngine, "templates/email-template.vm", "UTF-8", model);
+                         message.setText(text, true);                 
+                 }
+             };
+             
+             mailSender.send(preparator);
+       }
+
+}
diff --git a/SpringJava/Emails/src/main/resources/spring-configuration/spring-configuration.xml b/SpringJava/Emails/src/main/resources/spring-configuration/spring-configuration.xml
new file mode 100644 (file)
index 0000000..fd0aa8e
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xmlns:context="http://www.springframework.org/schema/context"
+  xmlns:util="http://www.springframework.org/schema/util"
+
+  xsi:schemaLocation="http://www.springframework.org/schema/beans 
+                      http://www.springframework.org/schema/beans/spring-beans.xsd
+                      http://www.springframework.org/schema/context 
+                      http://www.springframework.org/schema/context/spring-context.xsd
+                      http://www.springframework.org/schema/util 
+                      http://www.springframework.org/schema/util/spring-util.xsd">
+
+    <!-- Searches for beans in packages (instead of XML configuration we can use in this way annotations like @Service, @Endpoint, etc, etc)  -->
+    <context:component-scan base-package="de.spring.emails"/>
+
+       <bean id="smtpSession" class="org.springframework.jndi.JndiObjectFactoryBean">
+               <property name="jndiName" value="java:comp/env/mail/Session" />
+       </bean>
+       <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
+               <property name="session" ref="smtpSession" />
+       </bean>  
+
+       <bean id="velocityEngine"
+               class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
+               <property name="velocityProperties">
+                       <value>
+                               resource.loader=class
+                               class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
+                       </value>
+               </property>
+       </bean>
+
+       <bean id="emailNotificationService"
+               class="de.spring.emails.services.impl.EmailNotificationServiceImpl">
+               <constructor-arg ref="mailSender" />
+               <constructor-arg ref="velocityEngine" />
+       </bean>
+
+</beans>
diff --git a/SpringJava/Emails/src/main/resources/templates/email-template.vm b/SpringJava/Emails/src/main/resources/templates/email-template.vm
new file mode 100644 (file)
index 0000000..cd3f34e
--- /dev/null
@@ -0,0 +1,21 @@
+<html>
+       <body>
+               <h3>Dears all</h3>
+               <p>
+                       From - ${newMessage.name} / ${newMessage.email} 
+               </p>
+               <h3>
+                       Something new and exciting.
+               </h3>
+               <p>
+                       ${newMessage.metadataLine}
+               </p>
+               <h3>
+                       For further information.
+               </h3>
+               <p>
+                       ${newMessage.message}
+               </p>
+       </body>
+</html>
\ No newline at end of file