Джакарта Почта
Jakarta Mail (ранее JavaMail) — это Jakarta EE API , используемый для отправки и получения электронной почты через SMTP , POP3 и IMAP . Jakarta Mail встроен в платформу Jakarta EE, но также предоставляет дополнительный пакет для использования в Java SE . [ 1 ]
Текущая версия — 2.1.3, выпущенная 29 февраля 2024 г. [ 2 ] Существует еще одна реализация Jakarta Mail с открытым исходным кодом (GNU JavaMail), которая, хотя и поддерживает только устаревшую спецификацию JavaMail 1.3, предоставляет единственный бесплатный NNTP- сервер, который позволяет использовать эту технологию для чтения и отправки статей групп новостей .
По состоянию на 2019 год программное обеспечение известно как Jakarta Mail и является частью бренда Jakarta EE (ранее известного как Java EE ). Эталонная реализация является частью проекта Eclipse Angus .
Координаты Maven соответствующих проектов, необходимых для работы:
- почтовый API: jakarta.mail:jakarta.mail-api:2.1.3
- реализация почты: org.eclipse.angus:angus-mail:2.0.3
- мультимедийные расширения: jakarta.activation:jakarta.activation-api:2.1.3
Лицензирование
[ редактировать ]Jakarta Mail размещается как проект с открытым исходным кодом на Eclipse.org под новым названием Jakarta Mail . [ 3 ]
Большая часть исходного кода Jakarta Mail лицензируется по следующим лицензиям:
- ЭПЛ-2.0
- GPL-2.0 с лицензией Classpath Exception
- Исходный код демонстрационных программ распространяется по лицензии BSD.
Примеры
[ редактировать ]import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.time.*;
import java.util.*;
// Send a simple, single part, text/plain e-mail
public class TestEmail {
static Clock clock = Clock.systemUTC();
public static void main(String[] args) {
// SUBSTITUTE YOUR EMAIL ADDRESSES HERE!
String to = "sendToMailAddress";
String from = "sendFromMailAddress";
// SUBSTITUTE YOUR ISP'S 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("This is a test of sending a " +
"plain text e-mail through Java.\n" +
"Here is line 2.");
//Send the message
Transport.send(msg);
} catch (MessagingException mex) {
// Prints all nested (chained) exceptions as well
mex.printStackTrace();
}
}
}
Пример кода для отправки составных электронных писем, электронных писем в формате HTML и вложенных файлов
package org.example;
import jakarta.activation.*;
import jakarta.mail.*;
import jakarta.mail.internet.*;
import java.io.*;
import java.time.*;
import java.util.*;
public class SendMailUsage {
static Clock clock = Clock.systemUTC();
public static void main(String[] args) {
// SUBSTITUTE YOUR EMAIL ADDRESSES HERE!!!
String to = "sendToMailAddress";
String from = "sendFromMailAddress";
// SUBSTITUTE YOUR ISP'S 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 mex) {
// Prints all nested (chained) exceptions as well
mex.printStackTrace();
// How to access nested exceptions
while (null != mex.getNextException()) {
// Get next exception in chain
Exception ex = mex.getNextException();
ex.printStackTrace();
if (!(ex instanceof MessagingException)) break;
else mex = (MessagingException) ex;
}
}
}
// A simple, single-part text/plain e-mail.
public static void setTextContent(Message msg) throws MessagingException {
// Set message content
String mytxt = "This is a test of sending a " +
"plain text e-mail through Java.\n" +
"Here 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 = "<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 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 (null == html) 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";
}
}
}
Ссылки
[ редактировать ]- ^ «Включение JavaEE» . Проверено 12 ноября 2014 г.
- ^ «Домашняя страница почты Джакарты» . Проверено 5 сентября 2023 г.
- ^ «Почта Джакарты» . Проверено 3 сентября 2019 г.
Внешние ссылки
[ редактировать ]- Официальный сайт
- Страница проекта Jakarta Mail EE4J
- Часто задаваемые вопросы
- GNU JavaMail устарел, но содержит код для серверной части NNTP.