JavaMail
JavaMail | |
---|---|
Тип | библиотека функций |
Разработчик | Eclipse Foundation |
Написана на | Java |
Первый выпуск | 1996[1] |
Аппаратная платформа | кроссплатформенность |
Последняя версия | |
Репозиторий | github.com/eclipse-ee4j/… |
Лицензия | GNU GPL 2 и Common Development and Distribution License version 1.1[вд] |
Сайт | eclipse-ee4j.github.io/… (англ.) |
JavaMail — Java API предназначенное для получения и отправки электронной почты с использованием протоколов SMTP, POP3 и IMAP. JavaMail является частью платформы Java EE, но также доступен в качестве дополнительного пакета для использования в приложениях Java SE.
Существует также альтернативная реализация JavaMail с открытым исходным кодом — GNU JavaMail — которая реализует только спецификацию JavaMail версии 1.3; это единственная свободная реализация, поддерживающая протокол NNTP, позволяющий читать и отсылать статьи в новостные группы.
В состав JavaMail не входит почтовый сервер, однако для подобных задач могут использоваться свободные Apache James[англ.] и Java Email Server (POP3 и SMTP), или библиотека SubEthaSMTP для создания SMTP сервера[3].
Лицензия
[править | править код]Исходный код и скомпилированные библиотеки доступны под лицензией CDDL-1.1 и частично под GPLv2 с исключением для компоновки[англ.], а исходники примеров доступны по лицензии BSD[4].
Примеры использования
[править | править код]Получение сообщений по IMAP
[править | править код]import javax.mail.*;
import java.util.Properties;
public class TestImap {
public static void main(String[] args) throws Exception {
final String user = "username@mail.ru"; // имя пользователя
final String pass = "your password"; // пароль
final String host = "imap.mail.ru"; // адрес почтового сервера
// Создание свойств
Properties props = new Properties();
//включение debug-режима
props.put("mail.debug", "true");
//Указываем протокол - IMAP с SSL
props.put("mail.store.protocol", "imaps");
Session session = Session.getInstance(props);
Store store = session.getStore();
//подключаемся к почтовому серверу
store.connect(host, user, pass);
//получаем папку с входящими сообщениями
Folder inbox = store.getFolder("INBOX");
//открываем её только для чтения
inbox.open(Folder.READ_ONLY);
//получаем последнее сообщение (самое старое будет под номером 1)
Message m = inbox.getMessage(inbox.getMessageCount());
Multipart mp = (Multipart) m.getContent();
BodyPart bp = mp.getBodyPart(0);
//Выводим содержимое на экран
System.out.println(bp.getContent());
}
}
Пример отправки текстового сообщения
[править | править код]import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
// Отправка простого сообщения с типом контента "text/plain"
public class TestEmail {
public static void main(String[] args) {
// Сюда необходимо подставить адрес получателя сообщения
String to = "sendToMailAddress";
String from = "sendFromMailAddress";
// Сюда необходимо подставить SMTP сервер, используемый для отправки
String host = "smtp.yourisp.net";
// Тут указываем порт SMTP сервера.
int port = 123;
// Создание свойств, получение сессии
Properties props = new Properties();
// При использовании статического метода Transport.send()
// необходимо указать через какой хост будет передано сообщение
props.put("mail.smtp.host", host);
// Если почтовый сервер использует SSL
props.put("mail.smtp.ssl.enable", "true");
// Указываем порт SMTP сервера.
props.put("mail.smtp.port", port);
// Большинство SMTP серверов, используют авторизацию.
props.put("mail.smtp.auth", "true");
// Включение debug-режима
props.put("mail.debug", "true");
// Авторизируемся.
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
// Указываем логин пароль, от почты, с которой будем отправлять сообщение.
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("login", "password");
}
});
try {
// Создание объекта сообщения
Message msg = new MimeMessage(session);
// Установка атрибутов сообщения
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject("Test E-Mail through Java");
msg.setSentDate(new Date());
// Установка тела сообщения
msg.setText("This is a test of sending a " +
"plain text e-mail through Java.\n" +
"Here is line 2.");
// Отправка сообщения
Transport.send(msg);
}
catch (MessagingException mex) {
// Печать информации об исключении в случае его возникновения
mex.printStackTrace();
}
}
}
Пример отправки составного сообщения с файловыми вложениями
[править | править код]import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendMailUsage {
public static void main(String[] args) {
// Сюда необходимо подставить адрес получателя сообщения
String to = "sendToMailAddress";
String from = "sendFromMailAddress";
// Сюда необходимо подставить SMTP сервер, используемый для отправки
String host = "smtpserver.yourisp.net";
// Создание свойств, получение сессии
Properties props = new Properties();
// При использовании статического метода Transport.send()
// необходимо указать через какой хост будет передано сообщение
props.put("mail.smtp.host", host);
// Включение debug-режима
props.put("mail.debug", "true");
//Включение авторизации
props.put("mail.smtp.auth", "true");
// Получение сессии
Session session = Session.getInstance(props);
try {
// Получение объекта транспорта для передачи электронного сообщения
Transport bus = session.getTransport("smtp");
// Устанавливаем соединение один раз
// Метод Transport.send() отсоединяется после каждой отправки
//bus.connect();
// Обычно для SMTP сервера необходимо указать логин и пароль
bus.connect("smtpserver.yourisp.net", "username", "password");
// Создание объекта сообщения
Message msg = new MimeMessage(session);
// Установка атрибутов сообщения
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
// Парсинг списка адресов разделённых пробелами. Строгий синтаксис
msg.setRecipients(Message.RecipientType.CC,
InternetAddress.parse(to, true));
// Парсинг списка адресов разделённых пробелами. Более мягкий синтаксис.
msg.setRecipients(Message.RecipientType.BCC,
InternetAddress.parse(to, false));
msg.setSubject("Тест отправки E-Mail с помощью Java");
msg.setSentDate(new Date());
// Установка контента сообщения и отправка
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) {
// Печать информации обо всех возможных возникших исключениях
mex.printStackTrace();
// Получение вложенного исключения
while (mex.getNextException() != null) {
// Получение следующего исключения в цепочке
Exception ex = mex.getNextException();
ex.printStackTrace();
if (!(ex instanceof MessagingException)) break;
else mex = (MessagingException)ex;
}
}
}
// Сообщение, состоящее из одной части с типом контента text/plain.
public static void setTextContent(Message msg) throws MessagingException {
// Установка типа контента
String mytxt = "This is a test of sending a " +
"plain text e-mail through Java.\n" +
"Here is line 2.";
msg.setText(mytxt);
// Альтернативный способ
msg.setContent(mytxt, "text/plain");
}
// Сообщение с типом контента multipart/mixed. Обе части имеют тип контента text/plain.
public static void setMultipartContent(Message msg) throws MessagingException {
// Создание и заполнение первой части
MimeBodyPart p1 = new MimeBodyPart();
p1.setText("This is part one of a test multipart e-mail.");
// Создание и заполнение второй части
MimeBodyPart p2 = new MimeBodyPart();
// Here is how to set a charset on textual content
p2.setText("This is the second part", "us-ascii");
// Создание экземпляра класса Multipart. Добавление частей сообщения в него.
Multipart mp = new MimeMultipart();
mp.addBodyPart(p1);
mp.addBodyPart(p2);
// Установка объекта класса Multipart в качестве контента сообщения
msg.setContent(mp);
}
// Прикрепление файла в качестве вложения. Используется JAF FileDataSource.
public static void setFileAsAttachment(Message msg, String filename)
throws MessagingException {
// Создание и заполнение первой части
MimeBodyPart p1 = new MimeBodyPart();
p1.setText("This is part one of a test multipart e-mail." +
"The second part is file as an attachment");
// Создание второй части
MimeBodyPart p2 = new MimeBodyPart();
// Добавление файла во вторую часть
FileDataSource fds = new FileDataSource(filename);
p2.setDataHandler(new DataHandler(fds));
p2.setFileName(fds.getName());
// Создание экземпляра класса Multipart. Добавление частей сообщения в него.
Multipart mp = new MimeMultipart();
mp.addBodyPart(p1);
mp.addBodyPart(p2);
// Установка экземпляра класса Multipart в качестве контента документа
msg.setContent(mp);
}
// Добавление в первую часть html-контента.
// Оптправка данных любого другого типа производится аналогичным образом.
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 является внутренним классом
msg.setDataHandler(new DataHandler(new HTMLDataSource(html)));
}
/*
* Внутренний класс работает аналогично JAF datasource и добавляет HTML в контент сообщения
*/
static class HTMLDataSource implements DataSource {
private String html;
public HTMLDataSource(String htmlString) {
html = htmlString;
}
// Возвращаем html строку в InputStream.
// Каждый раз возвращается новый поток
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";
}
}
}
Примечания
[править | править код]- ↑ JavaMail™ API - A Technical Overview — С. 4.
- ↑ Release 2.1.3 — 2024.
- ↑ JavaMail API: mail servers . Дата обращения: 21 февраля 2015. Архивировано 21 февраля 2015 года.
- ↑ JavaMail License . Дата обращения: 20 февраля 2015. Архивировано 12 ноября 2014 года.