JavaMail — Java API предназначенное для получения и отправки электронной почты с использованием протоколов SMTP, POP3 и IMAP. JavaMail является частью платформы Java EE, но также доступен в качестве дополнительного пакета для использования в приложениях Java SE.

Существует также альтернативная реализация JavaMail с открытым исходным кодом — GNU JavaMail — которая реализует только спецификацию JavaMail версии 1.3; это единственная свободная реализация, поддерживающая протокол NNTP, позволяющий читать и отсылать статьи в новостные группы.

В состав JavaMail не входит почтовый сервер, однако для подобных задач могут использоваться свободные и Java Email Server (POP3 и SMTP), или библиотека SubEthaSMTP для создания SMTP сервера.

Лицензия Исходный код и скомпилированные библиотеки доступны под лицензией CDDL-1.1 и частично под GPLv2 с , а исходники примеров доступны по лицензии BSD.

Примеры использования Получение сообщений по IMAP import javax.mail.*; import java.util.Properties;

public class TestImap {

public static void main(String[] args) throws Exception { final String user = "[email protected]"; // имя пользователя 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 Homepage JavaMail project site on Kenai GNU JavaMail

Категория:Java Категория:Электронная почта Категория:Статьи с примерами кода Java