Jakarta Mail

This article was nominated for deletion. The discussion was closed on 12 September 2025 with a consensus to merge the content into the article Jakarta EE. If you find that such action has not been taken promptly, please consider assisting in the merger instead of re-nominating the article for deletion. To discuss the merger, please use the destination article's talk page. (September 2025)

|

This article relies too much on references to primary sources. Please improve this by adding secondary or tertiary sources. (August 2025) (Learn how and when to remove this template message)

|

Jakarta Mail (formerly JavaMail) is a Jakarta EE API used to send and receive email via SMTP, POP3 and IMAP. Jakarta Mail is built into the Jakarta EE platform, but also provides an optional package for use in Java SE.[1]

The current version is 2.1.3, released on February 29, 2024.[2] Another open source Jakarta Mail implementation exists (GNU JavaMail), which -while supporting only the obsolete JavaMail 1.3 specification- provides the only free NNTP backend, which makes it possible to use this technology to read and send news group articles.

As of 2019, the software is known as Jakarta Mail, and is part of the Jakarta EE brand (formerly known as Java EE). The reference implementation is part of the Eclipse Angus project.

Maven coordinates of the relevant projects required for operation are:

* mail API: jakarta.mail:jakarta.mail-api:2.1.3
* mail implementation: org.eclipse.angus:angus-mail:2.0.3
* multimedia extensions: jakarta.activation:jakarta.activation-api:2.1.3

## Contents

* 1 Licensing
* 2 Examples
* 3 References
* 4 External links

## Licensing

Jakarta Mail is hosted as an open source project on Eclipse.org under its new name Jakarta Mail.[3]

Most of the Jakarta Mail source code is licensed under the following licences:

* EPL-2.0
* GPL-2.0 with Classpath Exception license
* The source code for the demo programs is licensed under the BSD license

## Examples

package org.wikipedia.examples;

import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.Properties;

import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.Session;
import jakarta.mail.Transport;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;

// Send a simple, single part, text/plain e-mail
public class TestEmail {
static Clock clock = Clock.systemUTC();

public static void main(String[] args) {

// Substitute email address here
String to = "sendToMailAddress";
String from = "sendFromMailAddress";
// Substitute ISP mail server here
String host = "smtp.yourisp.invalid";

// Create properties, get Session
Properties props = new Properties();

// If using static Transport.send(),
// need to specify which host to send it to
props.put("mail.smtp.host", host);
// To see what is going on behind the scene
props.put("mail.debug", "true");
Session session = Session.getInstance(props);

try {
// Instantiate a message
Message msg = new MimeMessage(session);

// Set message attributes
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject("Test E-Mail through Java");
Date now = Date.from(LocalDateTime.now(clock).toInstant(ZoneOffset.UTC));
msg.setSentDate(now);

// Set message content
msg.setText(String.format("This is a test of sending a plain text e-mail through Java.\%nHere is line 2.");

// Send the message
Transport.send(msg);
} catch (MessagingException e) {
// Prints all nested (chained) exceptions as well
mex.printStackTrace();

Sample Code to Send Multipart E-Mail, HTML E-Mail and File Attachments

package org.wikipedia.examples;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.text.MessageFormat;
import java.time.Clock;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.Properties;

import jakarta.activation.DataHandler;
import jakarta.activation.DataSource;
import jakarta.activation.FileDataSource;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
import jakarta.mail.Multipart;
import jakarta.mail.Session;
import jakarta.mail.Transport;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeBodyPart;
import jakarta.mail.internet.MimeMultipart;

public class SendMailUsage {
static Clock clock = Clock.systemUTC();

public static void main(String[] args) {

// Substitute email addresses here
String to = "sendToMailAddress";
String from = "sendFromMailAddress";
// Substitute ISP mail server here
String host = "smtpserver.yourisp.invalid";

// Create properties for the Session
Properties props = new Properties();

// If using static Transport.send(),
// need to specify the mail server here
props.put("mail.smtp.host", host);
// To see what is going on behind the scene
props.put("mail.debug", "true");

// Get a session
Session session = Session.getInstance(props);

try {
// Get a Transport object to send e-mail
Transport bus = session.getTransport("smtp");

// Connect only once here
// Transport.send() disconnects after each send
// Usually, no username and password is required for SMTP
bus.connect();
// bus.connect("smtpserver.yourisp.net", "username", "password");

// Instantiate a message
Message msg = new MimeMessage(session);

// Set message attributes
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
// Parse a comma-separated list of email addresses. Be strict.
msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(to, true));
// Parse comma/space-separated list. Cut some slack.
msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(to, false));

msg.setSubject("Test E-Mail through Java");
msg.setSentDate(Date.from(LocalDateTime.now(clock).toInstant(ZoneOffset.UTC)));

// Set message content and send
setTextContent(msg);
msg.saveChanges();
bus.sendMessage(msg, address);

setMultipartContent(msg);
msg.saveChanges();
bus.sendMessage(msg, address);

setFileAsAttachment(msg, "C:/WINDOWS/CLOUD.GIF");
msg.saveChanges();
bus.sendMessage(msg, address);

setHTMLContent(msg);
msg.saveChanges();
bus.sendMessage(msg, address);

bus.close();

} catch (MessagingException e) {
// Prints all nested (chained) exceptions as well
e.printStackTrace();
// How to access nested exceptions
while (e.getNextException() != null) {
// Get next exception in chain
Exception ex = e.getNextException();
ex.printStackTrace();
if (!(ex instanceof MessagingException)) {
break;
} else {
e = (MessagingException) ex;

// A simple, single-part text/plain e-mail.
public static void setTextContent(Message msg) throws MessagingException {
// Set message content
String mytxt = String.format("This is a test of sending a plain text e-mail through Java.%nHere is line 2.");
msg.setText(mytxt);

// Alternate form
msg.setContent(mytxt, "text/plain");

// A simple multipart/mixed e-mail. Both body parts are text/plain.
public static void setMultipartContent(Message msg) throws MessagingException {
// Create and fill first part
MimeBodyPart p1 = new MimeBodyPart();
p1.setText("This is part one of a test multipart e-mail.");

// Create and fill second part
MimeBodyPart p2 = new MimeBodyPart();
// Here is how to set a charset on textual content
p2.setText("This is the second part", "us-ascii");

// Create the Multipart.  Add BodyParts to it.
Multipart mp = new MimeMultipart();
mp.addBodyPart(p1);
mp.addBodyPart(p2);

// Set Multipart as the message's content
msg.setContent(mp);

// Set a file as an attachment. Uses JAF FileDataSource.
public static void setFileAsAttachment(Message msg, String filename) throws MessagingException {

// Create and fill first part
MimeBodyPart p1 = new MimeBodyPart();
p1.setText("This is part one of a test multipart e-mail. The second part is file as an attachment");

// Create second part
MimeBodyPart p2 = new MimeBodyPart();

// Put a file in the second part
FileDataSource fds = new FileDataSource(filename);
p2.setDataHandler(new DataHandler(fds));
p2.setFileName(fds.getName());

// Create the Multipart. Add BodyParts to it.
Multipart mp = new MimeMultipart();
mp.addBodyPart(p1);
mp.addBodyPart(p2);

// Set Multipart as the message's content
msg.setContent(mp);

// Set a single part HTML content.
// Sending data of any type is similar.
public static void setHTMLContent(Message msg) throws MessagingException {

String html = String.format(
"<html><head><title>{0}</title></head><body><h1>{0}</h1><p>This is a test of sending an HTML e-mail through Java.</body></html>",
msg.getSubject(),
msg.getSubject()

// HTMLDataSource is a static nested class
msg.setDataHandler(new DataHandler(new HTMLDataSource(html)));

* Static nested class to act as a JAF datasource to send HTML e-mail content

static class HTMLDataSource implements DataSource {
private String html;

public HTMLDataSource(String htmlString) {
html = htmlString;

// Return html string in an InputStream.
// A new stream must be returned each time.
public InputStream getInputStream() throws IOException {
if (html == null) {
throw new IOException("Null HTML");

return new ByteArrayInputStream(html.getBytes());

public OutputStream getOutputStream() throws IOException {
throw new IOException("This DataHandler cannot write HTML");

public String getContentType() {
return "text/html";

public String getName() {
return "JAF text/html dataSource to send e-mail only";

## References

1. ↑ "JavaEE inclusion". http://www.oracle.com/technetwork/java/faq-135477.html#JDK. Retrieved 12 Nov 2014.
2. ↑ "Jakarta Mail Home Page". https://projects.eclipse.org/projects/ee4j.mail. Retrieved 5 September 2023.
3. ↑ "Jakarta Mail". https://projects.eclipse.org/projects/ee4j.mail. Retrieved 3 Sep 2019.

## External links

* No URL found. Please specify a URL here or add one to Wikidata.
* Jakarta Mail EE4J project page
* FAQ
* GNU JavaMail obsolete, but contains code for an NNTP backend

* v
* t
* e

Jakarta EE specifications

Web app|

* Servlet
* Server Pages
* Expression Language
* JSTL
* Server Faces
* WebSocket

Enterprise app|

* Dependency injection
* Bean Validation
* Enterprise Beans
* JPA
* JMS
* JTA
* Mail
* JCA
* Common Annotations

Web services|

* JAX-RS
* JAX-WS
* SOAP with Attachments
* Web Services Metadata
* JAXM
* JAXR

APM|

* Management

Other|

* JAXB
* JAX-RPC
* JAF

Related|

* JAXP
* JDBC
* JMX
* Streaming API for XML

0.00

(0 votes)

Original source: https://en.wikipedia.org/wiki/Jakarta Mail. Read more

|

Retrieved from "https://handwiki.org/wiki/index.php?title=Jakarta_Mail&oldid=4220964"
*[v]: View this template
*[t]: Discuss this template
*[e]: Edit this template