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 = "[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