Jakarta Mail

Last updated

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]

Contents

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:

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:

Examples

importjakarta.mail.*;importjakarta.mail.internet.*;importjava.time.*;importjava.util.*;// Send a simple, single part, text/plain e-mailpublicclassTestEmail{staticClockclock=Clock.systemUTC();publicstaticvoidmain(String[]args){// SUBSTITUTE YOUR EMAIL ADDRESSES HERE!Stringto="sendToMailAddress";Stringfrom="sendFromMailAddress";// SUBSTITUTE YOUR ISP'S MAIL SERVER HERE!Stringhost="smtp.yourisp.invalid";// Create properties, get SessionPropertiesprops=newProperties();// If using static Transport.send(),// need to specify which host to send it toprops.put("mail.smtp.host",host);// To see what is going on behind the sceneprops.put("mail.debug","true");Sessionsession=Session.getInstance(props);try{// Instantiate a messageMessagemsg=newMimeMessage(session);//Set message attributesmsg.setFrom(newInternetAddress(from));InternetAddress[]address={newInternetAddress(to)};msg.setRecipients(Message.RecipientType.TO,address);msg.setSubject("Test E-Mail through Java");Datenow=Date.from(LocalDateTime.now(clock).toInstant(ZoneOffset.UTC));msg.setSentDate(now);// Set message contentmsg.setText("This is a test of sending a "+"plain text e-mail through Java.\n"+"Here is line 2.");//Send the messageTransport.send(msg);}catch(MessagingExceptionmex){// Prints all nested (chained) exceptions as wellmex.printStackTrace();}}}

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

packageorg.example;importjakarta.activation.*;importjakarta.mail.*;importjakarta.mail.internet.*;importjava.io.*;importjava.time.*;importjava.util.*;publicclassSendMailUsage{staticClockclock=Clock.systemUTC();publicstaticvoidmain(String[]args){// SUBSTITUTE YOUR EMAIL ADDRESSES HERE!!!Stringto="sendToMailAddress";Stringfrom="sendFromMailAddress";// SUBSTITUTE YOUR ISP'S MAIL SERVER HERE!!!Stringhost="smtpserver.yourisp.invalid";// Create properties for the SessionPropertiesprops=newProperties();// If using static Transport.send(),// need to specify the mail server hereprops.put("mail.smtp.host",host);// To see what is going on behind the sceneprops.put("mail.debug","true");// Get a sessionSessionsession=Session.getInstance(props);try{// Get a Transport object to send e-mailTransportbus=session.getTransport("smtp");// Connect only once here// Transport.send() disconnects after each send// Usually, no username and password is required for SMTPbus.connect();//bus.connect("smtpserver.yourisp.net", "username", "password");// Instantiate a messageMessagemsg=newMimeMessage(session);// Set message attributesmsg.setFrom(newInternetAddress(from));InternetAddress[]address={newInternetAddress(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 sendsetTextContent(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(MessagingExceptionmex){// Prints all nested (chained) exceptions as wellmex.printStackTrace();// How to access nested exceptionswhile(null!=mex.getNextException()){// Get next exception in chainExceptionex=mex.getNextException();ex.printStackTrace();if(!(exinstanceofMessagingException))break;elsemex=(MessagingException)ex;}}}// A simple, single-part text/plain e-mail.publicstaticvoidsetTextContent(Messagemsg)throwsMessagingException{// Set message contentStringmytxt="This is a test of sending a "+"plain text e-mail through Java.\n"+"Here is line 2.";msg.setText(mytxt);// Alternate formmsg.setContent(mytxt,"text/plain");}// A simple multipart/mixed e-mail. Both body parts are text/plain.publicstaticvoidsetMultipartContent(Messagemsg)throwsMessagingException{// Create and fill first partMimeBodyPartp1=newMimeBodyPart();p1.setText("This is part one of a test multipart e-mail.");// Create and fill second partMimeBodyPartp2=newMimeBodyPart();// Here is how to set a charset on textual contentp2.setText("This is the second part","us-ascii");// Create the Multipart.  Add BodyParts to it.Multipartmp=newMimeMultipart();mp.addBodyPart(p1);mp.addBodyPart(p2);// Set Multipart as the message's contentmsg.setContent(mp);}// Set a file as an attachment.  Uses JAF FileDataSource.publicstaticvoidsetFileAsAttachment(Messagemsg,Stringfilename)throwsMessagingException{// Create and fill first partMimeBodyPartp1=newMimeBodyPart();p1.setText("This is part one of a test multipart e-mail."+"The second part is file as an attachment");// Create second partMimeBodyPartp2=newMimeBodyPart();// Put a file in the second partFileDataSourcefds=newFileDataSource(filename);p2.setDataHandler(newDataHandler(fds));p2.setFileName(fds.getName());// Create the Multipart.  Add BodyParts to it.Multipartmp=newMimeMultipart();mp.addBodyPart(p1);mp.addBodyPart(p2);// Set Multipart as the message's contentmsg.setContent(mp);}// Set a single part HTML content.// Sending data of any type is similar.publicstaticvoidsetHTMLContent(Messagemsg)throwsMessagingException{Stringhtml="<html><head><title>"+msg.getSubject()+"</title></head><body><h1>"+msg.getSubject()+"</h1><p>This is a test of sending an HTML e-mail"+" through Java.</body></html>";// HTMLDataSource is a static nested classmsg.setDataHandler(newDataHandler(newHTMLDataSource(html)));}/*     * Static nested class to act as a JAF datasource to send HTML e-mail content     */staticclassHTMLDataSourceimplementsDataSource{privateStringhtml;publicHTMLDataSource(StringhtmlString){html=htmlString;}// Return html string in an InputStream.// A new stream must be returned each time.publicInputStreamgetInputStream()throwsIOException{if(null==html)thrownewIOException("Null HTML");returnnewByteArrayInputStream(html.getBytes());}publicOutputStreamgetOutputStream()throwsIOException{thrownewIOException("This DataHandler cannot write HTML");}publicStringgetContentType(){return"text/html";}publicStringgetName(){return"JAF text/html dataSource to send e-mail only";}}}

References

  1. "JavaEE inclusion" . Retrieved 12 Nov 2014.
  2. "Jakarta Mail Home Page" . Retrieved 5 September 2023.
  3. "Jakarta Mail" . Retrieved 3 Sep 2019.