In this example we create a small program to send email with a file attachment. To send message with attachment we need to create an email with javax.mail.Multipart
object which basically will contain the email text message and then add a file to the second block, which both of them is an object of javax.mail.internet.MimeBodyPart
. In this example we also use the javax.activation.FileDataSource
.
package org.kodejava.mail;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;
public class SendEmailWithAttachment {
public static void main(String[] args) {
SendEmailWithAttachment demo = new SendEmailWithAttachment();
demo.sendEmail();
}
public void sendEmail() {
// Defines the E-Mail information.
String from = "[email protected]";
String to = "[email protected]";
String subject = "Important Message";
String bodyText = "This is a important message with attachment.";
// The attachment file name.
String attachmentName = "data.txt";
// Creates a Session with the following properties.
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.ssl.protocols", "TLSv1.2");
Session session = Session.getDefaultInstance(props);
try {
InternetAddress fromAddress = new InternetAddress(from);
InternetAddress toAddress = new InternetAddress(to);
// Create an Internet mail msg.
MimeMessage msg = new MimeMessage(session);
msg.setFrom(fromAddress);
msg.setRecipient(Message.RecipientType.TO, toAddress);
msg.setSubject(subject);
msg.setSentDate(new Date());
// Set the email msg text.
MimeBodyPart messagePart = new MimeBodyPart();
messagePart.setText(bodyText);
// Set the email attachment file
FileDataSource fileDataSource = new FileDataSource(attachmentName);
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.setDataHandler(new DataHandler(fileDataSource));
attachmentPart.setFileName(fileDataSource.getName());
// Create Multipart E-Mail.
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messagePart);
multipart.addBodyPart(attachmentPart);
msg.setContent(multipart);
// Send the msg. Don't forget to set the username and password
// to authenticate to the mail server.
Transport.send(msg, "kodejava", "password");
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
Maven Dependencies
<dependencies>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
</dependencies>
Latest posts by Wayan (see all)
- How do I get number of each day for a certain month in Java? - September 8, 2024
- How do I get operating system process information using ProcessHandle? - July 22, 2024
- How do I sum a BigDecimal property of a list of objects using Java Stream API? - July 22, 2024
Hi, I followed your code and its works for me but I want file name as dynamic, for example user uploaded file as attachment. I am using Struts 1.x. Please help me.
You might try this example to upload the file: https://kodejava.org/how-do-i-create-a-web-based-file-upload/. Later you can use this uploaded file and send it as an email attachment. Will this work for you?
I am getting this error
Hi Vivek,
Check the connection to
smtp.gmail.com
using telnet command to see if you can connect to it. Use the following command:If you can connect you should see something like this
I am unable to execute, throwing exception.
Hi Wayan, how to load this class onclick with a button, it doesn’t work for me; any idea?
Hi Jeredez,
I assume you are createing a Java Swing application. Here I have a small example sending email with a swing gui: https://kodejava.org/how-do-i-create-a-simple-mail-client-program-in-swing/.
Hi Wayan, Is there any property for compress or zip the file when adding as attachment to the email. Actually I am looking same compression functionality in Apache Camel.
Transport.send(msg, "kodejava", "password");
Its not allowing username and password here. How we can authenticate this one please help me.
Hi Ravi,
Make sure you are using JavaMail 1.5.x or later.