JavaMail — Википедия

JavaMail
Тип библиотека функций
Разработчик Eclipse Foundation
Написана на Java
Первый выпуск 1996[1]
Аппаратная платформа кроссплатформенность
Последняя версия
Репозиторий github.com/eclipse-ee4j/…
Лицензия GNU GPL 2 и Common Development and Distribution License version 1.1[вд]
Сайт projects.eclipse.org/… (англ.)

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";         }     }  } 

Примечания

[править | править код]
  1. JavaMail™ API - A Technical Overview — С. 4.
  2. Release 2.1.3 — 2024.
  3. JavaMail API: mail servers. Дата обращения: 21 февраля 2015. Архивировано 21 февраля 2015 года.
  4. JavaMail License. Дата обращения: 20 февраля 2015. Архивировано 12 ноября 2014 года.