Table of content:

    1. Coding e-mail utility class.
    2. Coding e-mail form.
    3. Coding servlet class.
    4. Configuring SMTP sever.
    5. Coding result page.
    6. Download Eclipse project or WAR file.
This article extends the tutorial Sending e-mail with JSP, Servlet and JavaMail by adding an ability which allows the user picking up a file to be sent along with the e-mail message as an attachment. The email form will have an additional field with which the user can select a file on his computer, like in the following screenshot:

email form with attach file

Workflow is similar to the sample application described in the tutorial Sending e-mail with JSP, Servlet and JavaMail, plus with some changes for handling file upload and attaching the file to the e-mail message, as follows:

    • Email form:
      • Add attribute enctype="multipart/form-data" to the form.
      • Use tag <inputtype="file"/> to show a file browser field.
Let’s see how each part of the application is constructed.

 

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)



Here is the JSP page that represents the e-mail form:

<%@ 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 its doPost()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 a multipart/form-data request.
This servlet processes submission from the e-mail form as follows:

    • 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.
NOTE:we don’t specify a directory to save the uploaded files, so the default directory would be the one from which the servlet container starts. If you want to specify the directory explicitly, use the location attribute of the @MultipartConfig annotation.

 

4. Configuring SMTP sever

SMTP server settings are configured in web.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:

 

Other JSP Tutorials:


About the Author:

is certified Java programmer (SCJP and SCWCD). He started programming with Java in the time of Java 1.4 and has been falling in love with Java since then. Make friend with him on Facebook and watch his Java videos you YouTube.



Attachments:
Download this file (EmailAttachWebApp.war)EmailAttachWebApp.war[Deployable WAR file]474 kB
Download this file (EmailAttachWebApp.zip)EmailAttachWebApp.zip[Eclipse project]482 kB

Add comment

   


Comments 

#47Ntokozo2022-05-21 14:00
Hi I got getParameters as nulls
Quote
#46Trần Hoàng2021-04-26 04:55
helloaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Quote
#4562021-03-31 09:41
hihihiihhihihhihihihihihihi
Quote
#44nagakiran.D2018-04-18 19:44
i need a jsp nini projects
Quote
#43Vinoth2018-04-17 08:24
No one projects either in zip/war file does't executed in our ecllipse.
Quote