In this post, I am going to show how we can integrate the FakeSmtp server with a java application.
Fake SMTP is a dummy SMTP server which is mainly used for testing the emails. It’s useful for the developers as it emits the email content into a local file directory. So we can check the local file content and do the validations.
The Dockerfile for the Fake Smtp is given below,
mail-rest-docker/tree/master/fake-smtp
FROM java:8
RUN mkdir -p /opt && \
wget -q http://nilhcem.github.com/FakeSMTP/downloads/fakeSMTP-latest.zip && \
unzip fakeSMTP-latest.zip -d /opt && \
rm fakeSMTP-latest.zip
VOLUME /output
RUN chmod +x /opt/fakeSMTP-2.0.jar
EXPOSE 25
CMD java -jar /opt/fakeSMTP-2.0.jar --start-server --background --output-dir /output --port 25
If you refer the last line of the above file, you can understand that the email content would be written under the /output folder. So we have to mount the local directory accordingly in the docker compose file.
Next one is the REST application code to send out the email to Fake SMTP server.
mail-rest-docker/blob/master/src/main/java/com/resource/MailResource.java
package com.resource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.Properties;
@Path("/sendMail")
public class MailResource {
Properties properties = System.getProperties();
public MailResource() {
properties.put("mail.smtp.host", System.getenv("SMTP_HOST"));
properties.put("mail.smtp.port", "25");
}
@GET
@Produces(MediaType.TEXT_HTML) public Response sendSimpleHelloMail() throws WebApplicationException {
String to = "test123@gmail.com";
String from = "test123@gmail.com";
Session session = Session.getDefaultInstance(properties);
try {
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Subject");
message.setContent("<h1>Hello</h1>", "text/html");
Transport.send(message);
System.out.println("Sent message successfully....");
}
catch (Exception ex) {
ex.printStackTrace();
throw new WebApplicationException(ex.getMessage());
}
return Response.ok().entity("Mail has been sent successfully").build();
}
}
The SMTP_HOST enviornmental variable should hold the Fake SMTP server host. In this case, we have to link the Fake SMTP service with the REST container and give that service. Refer the below docker-compose.yml file to know how to do that.
mail-rest-docker/blob/master/docker-compose.yml
rest:
image: mail-rest:latest
ports:
- 8080:8080
environment:
- SMTP_HOST=mail
links:
- mail:mail
mail:
image: fake-smtp:latest
volumes:
- ./output:/output
expose:
- 25
Here we have mounted the local output directory to output folder. so the mail content will be available under the output folder and linked the fake-smtp service and giving that in the SMTP_HOST env variable.
Follow the below steps to run this application,
1. Clone this repository
2. Package the project by running mvn Package
3. Run ‘docker images’ and confirm that the ‘mail-rest’ docker images is available.
3. Then go into fake-smtp folder and build the image by running ‘docker build -t fake-smtp:latest . ” and confirm that the ‘fake-smtp’ docker images is available.
4. Then go to project root folder(java-mail-rest) and run “docker-compose up -d”
5. Access the REST endpoint with http://localhost:8080/api/sendEmail
6. Check the output folder and confirm that there is an eml file created which has the email content
Here is the sample file content
mail-rest-docker/blob/master/output/220717072710377.eml
Sat, 22 Jul 2017 19:27:10 +0000 (UTC)
From: test123@gmail.com
To: test123@gmail.com
Message-ID: <840194110.01500751630345.JavaMail.root@2c7d28e1a4a2>
Subject: Subject
MIME-Version: 1.0
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
<h1>Hello</h1>
Refer the code @ https://github.com/dkbalachandar/mail-rest-docker