Send attachments with e-mail using JSP, Servlet and JavaMail
- Details
- Written by Nam Ha Minh
- Last Updated on 22 July 2019   |   Print Email
- Email form:
- Add attribute
enctype="multipart/form-data"
to the form. - Use tag
<input
type="file"/>
to show a file browser field.
- Add attribute
- File upload: Using built-in API for file upload which is available since Servlet 3.0 API. Based on this article: How to write upload file servlet with Servlet 3.0 API.
- Adding attachment to e-mail message is based on this article: Send e-mail with attachment in Java.
1. Coding an e-mail utility class
Following is code of EmailUtility.javaclass:package net.codejava.mail; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * A utility class for sending e-mail message with attachment. * @author www.codejava.net * */ public class EmailUtility { /** * Sends an e-mail message from a SMTP host with a list of attached files. * */ public static void sendEmailWithAttachment(String host, String port, final String userName, final String password, String toAddress, String subject, String message, List<File> attachedFiles) throws AddressException, MessagingException { // sets SMTP server properties Properties properties = new Properties(); properties.put("mail.smtp.host", host); properties.put("mail.smtp.port", port); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.user", userName); properties.put("mail.password", password); // creates a new session with an authenticator Authenticator auth = new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(userName, password); } }; Session session = Session.getInstance(properties, auth); // creates a new e-mail message Message msg = new MimeMessage(session); msg.setFrom(new InternetAddress(userName)); InternetAddress[] toAddresses = { new InternetAddress(toAddress) }; msg.setRecipients(Message.RecipientType.TO, toAddresses); msg.setSubject(subject); msg.setSentDate(new Date()); // creates message part MimeBodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setContent(message, "text/html"); // creates multi-part Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); // adds attachments if (attachedFiles != null && attachedFiles.size() > 0) { for (File aFile : attachedFiles) { MimeBodyPart attachPart = new MimeBodyPart(); try { attachPart.attachFile(aFile); } catch (IOException ex) { ex.printStackTrace(); } multipart.addBodyPart(attachPart); } } // sets the multi-part as e-mail's content msg.setContent(multipart); // sends the e-mail Transport.send(msg); } }To attach files to the e-mail message, we can pass a list of File into the sendEmailWithAttachment() method. This allows us adding none, one or more files if needed.
2. Coding the e-mail form (JSP)
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Send an e-mail with attachment</title> </head> <body> <form action="SendMailAttachServlet" method="post" enctype="multipart/form-data"> <table border="0" width="60%" align="center"> <caption><h2>Send New E-mail</h2></caption> <tr> <td width="50%">Recipient address </td> <td><input type="text" name="recipient" size="50"/></td> </tr> <tr> <td>Subject </td> <td><input type="text" name="subject" size="50"/></td> </tr> <tr> <td>Content </td> <td><textarea rows="10" cols="39" name="content"></textarea> </td> </tr> <tr> <td>Attach file </td> <td><input type="file" name="file" size="50" /></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="Send"/></td> </tr> </table> </form> </body> </html>Note that the
<form>
tag must have attribute enctype="multipart/form-data"
. If we want to have more attachments we can duplicate the <input type=”file” ../>
tag. 3. Coding Java Servlet class
Following is code of the servlet that handles e-mail form submission in itsdoPost()
method:package net.codejava.mail; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Part; /** * A servlet that takes message details from user and send it as a new e-mail * through an SMTP server. The e-mail message may contain attachments which * are the files uploaded from client. * * @author www.codejava.net * */ @WebServlet("/SendMailAttachServlet") @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB maxFileSize = 1024 * 1024 * 10, // 10MB maxRequestSize = 1024 * 1024 * 50) // 50MB public class SendMailAttachServlet extends HttpServlet { private String host; private String port; private String user; private String pass; public void init() { // reads SMTP server setting from web.xml file ServletContext context = getServletContext(); host = context.getInitParameter("host"); port = context.getInitParameter("port"); user = context.getInitParameter("user"); pass = context.getInitParameter("pass"); } /** * handles form submission */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<File> uploadedFiles = saveUploadedFiles(request); String recipient = request.getParameter("recipient"); String subject = request.getParameter("subject"); String content = request.getParameter("content"); String resultMessage = ""; try { EmailUtility.sendEmailWithAttachment(host, port, user, pass, recipient, subject, content, uploadedFiles); resultMessage = "The e-mail was sent successfully"; } catch (Exception ex) { ex.printStackTrace(); resultMessage = "There were an error: " + ex.getMessage(); } finally { deleteUploadFiles(uploadedFiles); request.setAttribute("message", resultMessage); getServletContext().getRequestDispatcher("/Result.jsp").forward( request, response); } } /** * Saves files uploaded from the client and return a list of these files * which will be attached to the e-mail message. */ private List<File> saveUploadedFiles(HttpServletRequest request) throws IllegalStateException, IOException, ServletException { List<File> listFiles = new ArrayList<File>(); byte[] buffer = new byte[4096]; int bytesRead = -1; Collection<Part> multiparts = request.getParts(); if (multiparts.size() > 0) { for (Part part : request.getParts()) { // creates a file to be saved String fileName = extractFileName(part); if (fileName == null || fileName.equals("")) { // not attachment part, continue continue; } File saveFile = new File(fileName); System.out.println("saveFile: " + saveFile.getAbsolutePath()); FileOutputStream outputStream = new FileOutputStream(saveFile); // saves uploaded file InputStream inputStream = part.getInputStream(); while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); listFiles.add(saveFile); } } return listFiles; } /** * Retrieves file name of a upload part from its HTTP header */ private String extractFileName(Part part) { String contentDisp = part.getHeader("content-disposition"); String[] items = contentDisp.split(";"); for (String s : items) { if (s.trim().startsWith("filename")) { return s.substring(s.indexOf("=") + 2, s.length() - 1); } } return null; } /** * Deletes all uploaded files, should be called after the e-mail was sent. */ private void deleteUploadFiles(List<File> listFiles) { if (listFiles != null && listFiles.size() > 0) { for (File aFile : listFiles) { aFile.delete(); } } } }This servlet class is annotated with the annotation @MultipartConfig which allows the servlet to parse
multipart/form-data
request. It also specifies some size limits on the upload:fileSizeThreshold
: the threshold beyond which the file will be saved into disk, instead of in memory.maxFileSize
: maximum size of an individual file.maxRequestSize
: maximum size of amultipart/form-data
request.
- First, it saves files uploaded and captures fields from the e-mail form.
- Then it calls the
EmailUtility
class to attach the files and send the e-mail. - Finally it deletes the uploaded files and sends the result page to the user with a successful or error message.
location
attribute of the @MultipartConfig
annotation. 4. Configuring SMTP sever
SMTP server settings are configured inweb.xml
file as follows:<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>EmailAttachWebApp</display-name> <!-- SMTP settings --> <context-param> <param-name>host</param-name> <param-value>smtp.gmail.com</param-value> </context-param> <context-param> <param-name>port</param-name> <param-value>25</param-value> </context-param> <context-param> <param-name>port</param-name> <param-value>587</param-value> </context-param> <context-param> <param-name>user</param-name> <param-value>YOUR_EMAIL</param-value> </context-param> <context-param> <param-name>pass</param-name> <param-value>YOUR_PASS</param-value> </context-param> <welcome-file-list> <welcome-file>EmailForm.jsp</welcome-file> </welcome-file-list> </web-app>Here, the SMTP host is GMail’s SMTP. Update these settings to match your SMTP account. And remember to check your e-mail account setting to make sure SMTP is enabled.
5. Coding result page
Code of the JSP page that shows result message to the user, is as simple as follows:<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Result</title> </head> <body> <center> <h3>${requestScope.message}</h3> </center> </body> </html>The EL expression
${requestScope.message}
prints value of the attribute message which is available in request scope. This attribute is set by the servlet. Related Java Send Email Tutorials:
- Sending e-mail with JSP, Servlet and JavaMail
- Send e-mail in HTML format using JavaMail API
- Send e-mail with attachment in Java
Other JSP Tutorials:
- Summary of EL operators with examples
- Java Servlet and JSP Hello World Tutorial with Eclipse, Maven and Apache Tomcat
- How to handle exceptions in JSP
- How to list records in a database table using JSP and JSTL
- How to create dynamic drop down list in JSP from database
Comments