Учебники

JavaMail API — Краткое руководство

JavaMail API предоставляет независимую от платформы и не зависящую от протокола структуру для создания приложений почты и обмена сообщениями. JavaMail API предоставляет набор абстрактных классов, определяющих объекты, составляющие почтовую систему. Это необязательный пакет (стандартное расширение) для чтения, составления и отправки электронных сообщений.

JavaMail предоставляет элементы, которые используются для создания интерфейса к системе обмена сообщениями, включая системные компоненты и интерфейсы. Хотя эта спецификация не определяет какую-либо конкретную реализацию, JavaMail включает в себя несколько классов, которые реализуют стандарты обмена сообщениями RFC822 и MIME. Эти классы поставляются как часть пакета классов JavaMail.

Ниже приведены некоторые из протоколов, поддерживаемых в JavaMail API:

  • SMTP : Сокращение от простого протокола пересылки почты . Он обеспечивает механизм доставки электронной почты.

  • POP : аббревиатура для почтового протокола . POP — это механизм, который большинство людей в Интернете используют для получения своей почты. Он определяет поддержку одного почтового ящика для каждого пользователя. RFC 1939 определяет этот протокол.

  • IMAP : Аббревиатура для протокола доступа к интернет-сообщениям . Это расширенный протокол для получения сообщений. Он обеспечивает поддержку нескольких почтовых ящиков для каждого пользователя, в дополнение к тому, что почтовый ящик может совместно использоваться несколькими пользователями. Это определено в RFC 2060.

  • MIME : Аббревиатура для многоцелевых расширений электронной почты в Интернете . , Это не протокол передачи почты. Вместо этого он определяет содержание того, что передается: формат сообщений, вложения и так далее. Здесь действует множество различных документов: RFC 822, RFC 2045, RFC 2046 и RFC 2047. Как пользователь JavaMail API, вам обычно не нужно беспокоиться об этих форматах. Однако эти форматы существуют и используются вашими программами.

  • NNTP и другие . Существует множество протоколов, предоставляемых сторонними поставщиками. Некоторыми из них являются протокол передачи сетевых новостей (NNTP), безопасные многоцелевые расширения электронной почты в Интернете (S / MIME) и т. Д.

SMTP : Сокращение от простого протокола пересылки почты . Он обеспечивает механизм доставки электронной почты.

POP : аббревиатура для почтового протокола . POP — это механизм, который большинство людей в Интернете используют для получения своей почты. Он определяет поддержку одного почтового ящика для каждого пользователя. RFC 1939 определяет этот протокол.

IMAP : Аббревиатура для протокола доступа к интернет-сообщениям . Это расширенный протокол для получения сообщений. Он обеспечивает поддержку нескольких почтовых ящиков для каждого пользователя, в дополнение к тому, что почтовый ящик может совместно использоваться несколькими пользователями. Это определено в RFC 2060.

MIME : Аббревиатура для многоцелевых расширений электронной почты в Интернете . , Это не протокол передачи почты. Вместо этого он определяет содержание того, что передается: формат сообщений, вложения и так далее. Здесь действует множество различных документов: RFC 822, RFC 2045, RFC 2046 и RFC 2047. Как пользователь JavaMail API, вам обычно не нужно беспокоиться об этих форматах. Однако эти форматы существуют и используются вашими программами.

NNTP и другие . Существует множество протоколов, предоставляемых сторонними поставщиками. Некоторыми из них являются протокол передачи сетевых новостей (NNTP), безопасные многоцелевые расширения электронной почты в Интернете (S / MIME) и т. Д.

Детали этого будут рассмотрены в следующих главах.

Архитектура

Как сказано выше, Java-приложение использует JavaMail API для создания, отправки и получения электронной почты. На следующем рисунке показана архитектура JavaMail:

JavaMail API Архитектура

Абстрактный механизм JavaMail API похож на другие J2EE API, такие как JDBC, JNDI и JMS. Как видно на диаграмме архитектуры выше, JavaMail API делится на две основные части:

  • Независимая от приложения часть. Интерфейс прикладного программирования (API) используется компонентами приложения для отправки и получения почтовых сообщений независимо от используемого основного поставщика или протокола.

  • Зависимая от службы часть: интерфейс поставщика услуг (SPI) говорит на языках протокола, таких как SMTP, POP, IMAP и протокол передачи сетевых новостей (NNTP). Он используется для подключения поставщика услуг электронной почты к платформе J2EE.

Независимая от приложения часть. Интерфейс прикладного программирования (API) используется компонентами приложения для отправки и получения почтовых сообщений независимо от используемого основного поставщика или протокола.

Зависимая от службы часть: интерфейс поставщика услуг (SPI) говорит на языках протокола, таких как SMTP, POP, IMAP и протокол передачи сетевых новостей (NNTP). Он используется для подключения поставщика услуг электронной почты к платформе J2EE.

Настройка среды

Для отправки электронной почты с использованием Java-приложения достаточно просто, но для начала на вашем компьютере должны быть установлены JavaMail API и Java Activation Framework (JAF) .

Вам понадобится расширение JavaBeans Activation Framework (JAF), которое предоставляет пакет javax.activation только тогда, когда вы не используете Java SE 6 или новее.

  • Вы можете загрузить последнюю версию JavaMail (Версия 1.5.0) со стандартного веб-сайта Java.

  • Вы можете загрузить последнюю версию JAF (Версия 1.1.1) со стандартного веб-сайта Java.

Вы можете загрузить последнюю версию JavaMail (Версия 1.5.0) со стандартного веб-сайта Java.

Вы можете загрузить последнюю версию JAF (Версия 1.1.1) со стандартного веб-сайта Java.

Загрузите и разархивируйте эти файлы, во вновь созданных каталогах верхнего уровня вы найдете несколько jar-файлов для обоих приложений. Вам необходимо добавить файлы mail.jar и активации.jar в ваш CLASSPATH.

SMTP-сервер

Для отправки электронной почты у вас должен быть SMTP-сервер, который отвечает за отправку почты. Вы можете использовать один из следующих методов для получения SMTP-сервера:

  • Установите и используйте любой SMTP-сервер, такой как сервер Postfix (для Ubuntu), сервер Apache James (Java Apache Mail Enterprise Server) и т. Д. (или же)

  • Используйте SMTP-сервер, предоставленный хост-провайдером, например, для бесплатного SMTP, предоставляемого сайтом JangoSMTP, является relay.jangosmtp.net (или)

  • Используйте SMTP-сервер, предоставляемый компаниями, например, Gmail, Yahoo и т. Д.

Установите и используйте любой SMTP-сервер, такой как сервер Postfix (для Ubuntu), сервер Apache James (Java Apache Mail Enterprise Server) и т. Д. (или же)

Используйте SMTP-сервер, предоставленный хост-провайдером, например, для бесплатного SMTP, предоставляемого сайтом JangoSMTP, является relay.jangosmtp.net (или)

Используйте SMTP-сервер, предоставляемый компаниями, например, Gmail, Yahoo и т. Д.

В примерах, приведенных в последующих главах, мы использовали бесплатный сервер JangoSMTP для отправки электронной почты. Вы можете создать учетную запись, посетив этот сайт и настроить адрес электронной почты.

Основные классы

JavaMail API состоит из некоторых интерфейсов и классов, используемых для отправки, чтения и удаления сообщений электронной почты. Хотя в JavaMail API много пакетов, они будут охватывать два основных пакета, которые часто используются в Java Mail API: пакет javax.mail и javax.mail.internet . Эти пакеты содержат все основные классы JavaMail. Они есть:

Учебный класс Описание
javax.mail.Session Ключевой класс API. Многопоточный объект представляет фабрику соединений.
javax.mail.Message Абстрактный класс, который моделирует сообщение электронной почты. Подклассы обеспечивают фактические реализации.
javax.mail.Address Абстрактный класс, который моделирует адреса (от и до адресов) в сообщении. Подклассы обеспечивают конкретные реализации.
javax.mail.Authenticator Абстрактный класс, используемый для защиты почтовых ресурсов на почтовом сервере.
javax.mail.Transport Абстрактный класс, который моделирует механизм транспорта сообщений для отправки сообщений электронной почты.
javax.mail.Store Абстрактный класс, который моделирует хранилище сообщений и его протокол доступа, для хранения и извлечения сообщений. Магазин делится на папки.
javax.mail.Folder Абстрактный класс, представляющий папку почтовых сообщений. Может содержать подпапки.
javax.mail.internet. MimeMessage Сообщение является абстрактным классом, поэтому должно работать с подклассом; в большинстве случаев вы будете использовать MimeMessage. MimeMessage — это сообщение электронной почты, которое понимает типы и заголовки MIME.
javax.mail.internet. InternetAddress Этот класс представляет адрес электронной почты в Интернете с использованием синтаксиса RFC822. Типичный синтаксис адреса имеет вид [email protected] или Личное имя <[email protected]> .

Отправка простых писем

Вот пример для отправки простого электронного письма. Здесь мы использовали сервер JangoSMTP, через который электронные письма отправляются на наш адрес электронной почты. Настройка объясняется в главе « Настройка среды» .

Чтобы отправить простое электронное письмо, выполните следующие действия:

  • Получить сессию

  • Создайте объект MimeMessage по умолчанию и установите From, To, Subject в сообщении.

  • Установите фактическое сообщение как:

    message.setText("your text goes here");
  • Отправьте сообщение, используя транспортный объект.

Получить сессию

Создайте объект MimeMessage по умолчанию и установите From, To, Subject в сообщении.

Установите фактическое сообщение как:

Отправьте сообщение, используя транспортный объект.

Создать класс Java

Создайте файл java класса SendEmail , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";
      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
	   }
         });

      try {
	   // Create a default MimeMessage object.
	   Message message = new MimeMessage(session);
	
	   // Set From: header field of the header.
	   message.setFrom(new InternetAddress(from));
	
	   // Set To: header field of the header.
	   message.setRecipients(Message.RecipientType.TO,
               InternetAddress.parse(to));
	
	   // Set Subject: header field
	   message.setSubject("Testing Subject");
	
	   // Now set the actual message
	   message.setText("Hello, this is sample for to check send " +
		"email using JavaMailAPI ");

	   // Send message
	   Transport.send(message);

	   System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Поскольку мы используем SMTP-сервер, предоставленный хост-провайдером JangoSMTP, нам необходимо аутентифицировать имя пользователя и пароль. Класс javax.mail.PasswordAuthentication используется для аутентификации пароля.

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс SendEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

Sent message successfully....

Поскольку я отправляю электронное письмо на мой адрес Gmail через JangoSMTP, в папку входящих сообщений моей учетной записи Gmail будет получено следующее письмо:

JavaMail API Отправить электронную почту

Отправка письма с вложением

Вот пример отправки электронного письма с приложением с вашего компьютера. Файл на локальной машине — file.txt, расположенный в / home / manisha / . Здесь мы использовали сервер JangoSMTP, через который электронные письма отправляются на наш адрес электронной почты. Настройка объясняется в главе « Настройка среды» .

Чтобы отправить электронное письмо со встроенным изображением, выполните следующие действия:

  • Получить сессию

  • Создайте объект MimeMessage по умолчанию и установите From, To, Subject в сообщении.

  • Установите фактическое сообщение, как показано ниже:

    messageBodyPart.setText("This is message body");
  • Создайте объект MimeMultipart. Добавьте вышеупомянутый messageBodyPart с установленным в нем фактическим сообщением к этому составному объекту.

  • Затем добавьте вложение, создав обработчик данных следующим образом:

    messageBodyPart = new MimeBodyPart();
    String filename = "/home/manisha/file.txt";
    DataSource source = new FileDataSource(filename);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(filename);
    multipart.addBodyPart(messageBodyPart);
  • Затем установите multipart в сообщении следующим образом:

    message.setContent(multipart);
  • Отправьте сообщение, используя транспортный объект.

Получить сессию

Создайте объект MimeMessage по умолчанию и установите From, To, Subject в сообщении.

Установите фактическое сообщение, как показано ниже:

Создайте объект MimeMultipart. Добавьте вышеупомянутый messageBodyPart с установленным в нем фактическим сообщением к этому составному объекту.

Затем добавьте вложение, создав обработчик данных следующим образом:

Затем установите multipart в сообщении следующим образом:

Отправьте сообщение, используя транспортный объект.

Создать класс Java

Создайте файл java класса SendAttachmentInEmail , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class SendAttachmentInEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";

      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
         });

      try {
         // Create a default MimeMessage object.
         Message message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse(to));

         // Set Subject: header field
         message.setSubject("Testing Subject");

         // Create the message part
         BodyPart messageBodyPart = new MimeBodyPart();

         // Now set the actual message
         messageBodyPart.setText("This is message body");

         // Create a multipar message
         Multipart multipart = new MimeMultipart();

         // Set text message part
         multipart.addBodyPart(messageBodyPart);

         // Part two is attachment
         messageBodyPart = new MimeBodyPart();
         String filename = "/home/manisha/file.txt";
         DataSource source = new FileDataSource(filename);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         multipart.addBodyPart(messageBodyPart);

         // Send the complete message parts
         message.setContent(multipart);

         // Send message
         Transport.send(message);

         System.out.println("Sent message successfully....");
  
      } catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Поскольку мы используем SMTP-сервер, предоставленный хост-провайдером JangoSMTP, нам необходимо аутентифицировать имя пользователя и пароль. Класс javax.mail.PasswordAuthentication используется для аутентификации пароля.

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс SendAttachmentInEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendAttachmentInEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendAttachmentInEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

Sent message successfully....

Поскольку я отправляю электронное письмо на мой адрес Gmail через JangoSMTP, в папку входящих сообщений моей учетной записи Gmail будет получено следующее письмо:

JavaMail API Отправить письмо с вложением

Отправка электронного письма в формате HTML

Вот пример для отправки электронного письма в формате HTML с вашего компьютера. Здесь мы использовали сервер JangoSMTP, через который электронные письма отправляются на наш адрес электронной почты. Настройка объясняется в главе « Настройка среды» .

Этот пример очень похож на отправку простой электронной почты, за исключением того, что здесь мы используем метод setContent () для установки содержимого, второй аргумент которого — «text / html», чтобы указать, что содержимое HTML включено в сообщение. Используя этот пример, вы можете отправить настолько большой, насколько вам нравится, контент HTML.

Чтобы отправить электронное письмо с содержимым HTML, выполните следующие действия:

  • Получить сессию

  • Создайте объект MimeMessage по умолчанию и установите From, To, Subject в сообщении.

  • Установите фактическое сообщение, используя метод setContent (), как показано ниже:

    message.setContent("<h1>This is actual message embedded in 
       HTML tags</h1>", "text/html");
  • Отправьте сообщение, используя транспортный объект.

Получить сессию

Создайте объект MimeMessage по умолчанию и установите From, To, Subject в сообщении.

Установите фактическое сообщение, используя метод setContent (), как показано ниже:

Отправьте сообщение, используя транспортный объект.

Создать класс Java

Создайте файл java класса SendHTMLEmail , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendHTMLEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";
      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
	});

      try {
            // Create a default MimeMessage object.
            Message message = new MimeMessage(session);

   	   // Set From: header field of the header.
	   message.setFrom(new InternetAddress(from));

	   // Set To: header field of the header.
	   message.setRecipients(Message.RecipientType.TO,
              InternetAddress.parse(to));

	   // Set Subject: header field
	   message.setSubject("Testing Subject");

	   // Send the actual HTML message, as big as you like
	   message.setContent(
              "<h1>This is actual message embedded in HTML tags</h1>",
             "text/html");

	   // Send message
	   Transport.send(message);

	   System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
	   e.printStackTrace();
	   throw new RuntimeException(e);
      }
   }
}

Поскольку мы используем SMTP-сервер, предоставленный хост-провайдером JangoSMTP, нам необходимо аутентифицировать имя пользователя и пароль. Класс javax.mail.PasswordAuthentication используется для аутентификации пароля.

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс SendHTMLEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendHTMLEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendHTMLEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

Sent message successfully....

Поскольку я отправляю электронное письмо на мой адрес Gmail через JangoSMTP, в папку входящих сообщений моей учетной записи Gmail будет получено следующее письмо:

JavaMail API Отправить HTML письмо

Отправка электронной почты со встроенными изображениями

Вот пример отправки сообщения электронной почты в формате HTML с вашего компьютера со встроенным изображением. Здесь мы использовали сервер JangoSMTP, через который электронные письма отправляются на наш адрес электронной почты. Настройка объясняется в главе « Настройка среды» .

Чтобы отправить электронное письмо со встроенным изображением, выполните следующие действия:

  • Получить сессию

  • Создайте объект MimeMessage по умолчанию и установите From, To, Subject в сообщении.

  • Создайте объект MimeMultipart.

  • В нашем примере у нас будет часть HTML и изображение в электронном письме. Поэтому сначала создайте содержимое HTML и установите его в составном объекте следующим образом:

    // first part (the html)
    BodyPart messageBodyPart = new MimeBodyPart();
    String htmlText = "<H1>Hello</H1><img src=\"cid:image\">";
    messageBodyPart.setContent(htmlText, "text/html");
    // add it
    multipart.addBodyPart(messageBodyPart);
  • Затем добавьте изображение, создав обработчик данных следующим образом:

    // second part (the image)
    messageBodyPart = new MimeBodyPart();
    DataSource fds = new FileDataSource(
     "/home/manisha/javamail-mini-logo.png");
    
    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setHeader("Content-ID", "<image>");
  • Затем установите multipart в сообщении следующим образом:

    message.setContent(multipart);
  • Отправьте сообщение, используя транспортный объект.

Получить сессию

Создайте объект MimeMessage по умолчанию и установите From, To, Subject в сообщении.

Создайте объект MimeMultipart.

В нашем примере у нас будет часть HTML и изображение в электронном письме. Поэтому сначала создайте содержимое HTML и установите его в составном объекте следующим образом:

Затем добавьте изображение, создав обработчик данных следующим образом:

Затем установите multipart в сообщении следующим образом:

Отправьте сообщение, используя транспортный объект.

Создать класс Java

Создайте файл java класса SendInlineImagesInEmail , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class SendInlineImagesInEmail {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";
      final String username = "manishaspatil";//change accordingly
      final String password = "******";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "relay.jangosmtp.net";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");

      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
         });

      try {

         // Create a default MimeMessage object.
         Message message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse(to));

         // Set Subject: header field
         message.setSubject("Testing Subject");

         // This mail has 2 part, the BODY and the embedded image
         MimeMultipart multipart = new MimeMultipart("related");

         // first part (the html)
         BodyPart messageBodyPart = new MimeBodyPart();
         String htmlText = "<H1>Hello</H1><img src=\"cid:image\">";
         messageBodyPart.setContent(htmlText, "text/html");
         // add it
         multipart.addBodyPart(messageBodyPart);

         // second part (the image)
         messageBodyPart = new MimeBodyPart();
         DataSource fds = new FileDataSource(
            "/home/manisha/javamail-mini-logo.png");

         messageBodyPart.setDataHandler(new DataHandler(fds));
         messageBodyPart.setHeader("Content-ID", "<image>");

         // add image to the multipart
         multipart.addBodyPart(messageBodyPart);

         // put everything together
         message.setContent(multipart);
         // Send message
         Transport.send(message);

         System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Поскольку мы используем SMTP-сервер, предоставленный хост-провайдером JangoSMTP, нам необходимо аутентифицировать имя пользователя и пароль. Класс javax.mail.PasswordAuthentication используется для аутентификации пароля.

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс SendInlineImagesInEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendInlineImagesInEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendInlineImagesInEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

Sent message successfully....

Поскольку я отправляю электронное письмо на мой адрес Gmail через JangoSMTP, в папку входящих сообщений моей учетной записи Gmail будет получено следующее письмо:

JavaMail API Отправить письмо со встроенными изображениями

Проверка электронной почты

Есть два аспекта, которые необходимо понять, прежде чем перейти к этой главе. Это проверка и выборка .

  • Проверка электронной почты в JavaMail — это процесс, при котором мы открываем соответствующую папку в почтовом ящике и получаем каждое сообщение. Здесь мы проверяем только заголовок каждого сообщения, то есть, От, До, тема . Контент не читается.

  • Получение электронной почты в JavaMail — это процесс, в котором мы открываем соответствующую папку в почтовом ящике и получаем каждое сообщение. Наряду с заголовком мы также читаем контент, распознавая тип контента.

Проверка электронной почты в JavaMail — это процесс, при котором мы открываем соответствующую папку в почтовом ящике и получаем каждое сообщение. Здесь мы проверяем только заголовок каждого сообщения, то есть, От, До, тема . Контент не читается.

Получение электронной почты в JavaMail — это процесс, в котором мы открываем соответствующую папку в почтовом ящике и получаем каждое сообщение. Наряду с заголовком мы также читаем контент, распознавая тип контента.

Чтобы проверить или получить электронную почту с помощью JavaMail API, нам понадобятся серверы POP или IMAP. Для проверки и получения писем необходимы классы папок и хранилищ. Здесь мы использовали POP3-сервер GMAIL (pop.gmail.com). В этой главе вы узнаете, как проверять электронную почту с помощью JavaMail API. Выборка будет рассмотрена в последующих главах. Чтобы проверить электронную почту:

  • Получить сессию

  • Создайте объект pop3 Store и соединитесь с поп-сервером.

  • Создать папку объекта. Откройте соответствующую папку в вашем почтовом ящике.

  • Получите ваши сообщения.

  • Закройте объекты Store и Folder.

Получить сессию

Создайте объект pop3 Store и соединитесь с поп-сервером.

Создать папку объекта. Откройте соответствующую папку в вашем почтовом ящике.

Получите ваши сообщения.

Закройте объекты Store и Folder.

Создать класс Java

Создайте файл класса java CheckingMails , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

public class CheckingMails {

   public static void check(String host, String storeType, String user,
      String password) 
   {
      try {

      //create properties field
      Properties properties = new Properties();

      properties.put("mail.pop3.host", host);
      properties.put("mail.pop3.port", "995");
      properties.put("mail.pop3.starttls.enable", "true");
      Session emailSession = Session.getDefaultInstance(properties);
  
      //create the POP3 store object and connect with the pop server
      Store store = emailSession.getStore("pop3s");

      store.connect(host, user, password);

      //create the folder object and open it
      Folder emailFolder = store.getFolder("INBOX");
      emailFolder.open(Folder.READ_ONLY);

      // retrieve the messages from the folder in an array and print it
      Message[] messages = emailFolder.getMessages();
      System.out.println("messages.length---" + messages.length);

      for (int i = 0, n = messages.length; i < n; i++) {
         Message message = messages[i];
         System.out.println("---------------------------------");
         System.out.println("Email Number " + (i + 1));
         System.out.println("Subject: " + message.getSubject());
         System.out.println("From: " + message.getFrom()[0]);
         System.out.println("Text: " + message.getContent().toString());

      }

      //close the store and folder objects
      emailFolder.close(false);
      store.close();

      } catch (NoSuchProviderException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {

      String host = "pop.gmail.com";// change accordingly
      String mailStoreType = "pop3";
      String username = "[email protected]";// change accordingly
      String password = "*****";// change accordingly

      check(host, mailStoreType, username, password);

   }

}

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс CheckingMails.java в каталоге: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: CheckingMails.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: CheckingMails

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

messages.length---4
---------------------------------
Email Number 1
Subject: Test Mail--Fetch
From: <abcd@gmail.com>
Text: javax.mail.internet.MimeMultipart@327a5b7f
---------------------------------
Email Number 2
Subject: testing ----checking simple email
From: <abcd@gmail.com>
Text: javax.mail.internet.MimeMultipart@7f0d08bc
---------------------------------
Email Number 3
Subject: Email with attachment
From: <abcd@gmail.com>
Text: javax.mail.internet.MimeMultipart@30b8afce
---------------------------------
Email Number 4
Subject: Email with Inline image
From: <abcd@gmail.com>
Text: javax.mail.internet.MimeMultipart@2d1e165f

Здесь мы напечатали количество сообщений в INBOX, которое в данном случае равно 4. Мы также напечатали тему, адрес и текст для каждого сообщения электронной почты.

Получение писем

В предыдущей главе мы узнали, как проверять электронную почту. Теперь давайте посмотрим, как получить каждое письмо и прочитать его содержимое. Давайте напишем Java-класс FetchingEmail, который будет читать следующие типы электронных писем:

  • Простая электронная почта

  • Электронная почта с приложением

  • Электронная почта со встроенным изображением

Простая электронная почта

Электронная почта с приложением

Электронная почта со встроенным изображением

Основные шаги в коде приведены ниже:

  • Получить объект Session.

  • Создайте объект магазина POP3 и подключитесь к магазину.

  • Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике.

  • Получать сообщения.

  • Закройте папку и сохраните объекты соответственно.

Получить объект Session.

Создайте объект магазина POP3 и подключитесь к магазину.

Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике.

Получать сообщения.

Закройте папку и сохраните объекты соответственно.

Создать класс Java

Создайте Java. Создайте файл класса Java FetchingEmail , содержимое которого приведено ниже:

package com.tutorialspoint;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;

public class FetchingEmail {

   public static void fetch(String pop3Host, String storeType, String user,
      String password) {
      try {
         // create properties field
         Properties properties = new Properties();
         properties.put("mail.store.protocol", "pop3");
         properties.put("mail.pop3.host", pop3Host);
         properties.put("mail.pop3.port", "995");
         properties.put("mail.pop3.starttls.enable", "true");
         Session emailSession = Session.getDefaultInstance(properties);
         // emailSession.setDebug(true);

         // create the POP3 store object and connect with the pop server
         Store store = emailSession.getStore("pop3s");

         store.connect(pop3Host, user, password);

         // create the folder object and open it
         Folder emailFolder = store.getFolder("INBOX");
         emailFolder.open(Folder.READ_ONLY);

         BufferedReader reader = new BufferedReader(new InputStreamReader(
	      System.in));

         // retrieve the messages from the folder in an array and print it
         Message[] messages = emailFolder.getMessages();
         System.out.println("messages.length---" + messages.length);

         for (int i = 0; i < messages.length; i++) {
            Message message = messages[i];
            System.out.println("---------------------------------");
            writePart(message);
            String line = reader.readLine();
            if ("YES".equals(line)) {
               message.writeTo(System.out);
            } else if ("QUIT".equals(line)) {
               break;
            }
         }

         // close the store and folder objects
         emailFolder.close(false);
         store.close();

      } catch (NoSuchProviderException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (Exception e) {
         e.printStackTrace();
      }
}

   public static void main(String[] args) {

      String host = "pop.gmail.com";// change accordingly
      String mailStoreType = "pop3";
      String username = 
         "[email protected]";// change accordingly
      String password = "*****";// change accordingly

      //Call method fetch
      fetch(host, mailStoreType, username, password);

   }

   /*
   * This method checks for content-type 
   * based on which, it processes and
   * fetches the content of the message
   */
   public static void writePart(Part p) throws Exception {
      if (p instanceof Message)
         //Call methos writeEnvelope
         writeEnvelope((Message) p);

      System.out.println("----------------------------");
      System.out.println("CONTENT-TYPE: " + p.getContentType());

      //check if the content is plain text
      if (p.isMimeType("text/plain")) {
         System.out.println("This is plain text");
         System.out.println("---------------------------");
         System.out.println((String) p.getContent());
      } 
      //check if the content has attachment
      else if (p.isMimeType("multipart/*")) {
         System.out.println("This is a Multipart");
         System.out.println("---------------------------");
         Multipart mp = (Multipart) p.getContent();
         int count = mp.getCount();
         for (int i = 0; i < count; i++)
            writePart(mp.getBodyPart(i));
      } 
      //check if the content is a nested message
      else if (p.isMimeType("message/rfc822")) {
         System.out.println("This is a Nested Message");
         System.out.println("---------------------------");
         writePart((Part) p.getContent());
      } 
      //check if the content is an inline image
      else if (p.isMimeType("image/jpeg")) {
         System.out.println("--------> image/jpeg");
         Object o = p.getContent();

         InputStream x = (InputStream) o;
         // Construct the required byte array
         System.out.println("x.length = " + x.available());
         int i = 0;
         byte[] bArray = new byte[x.available()];

         while ((i = (int) ((InputStream) x).available()) > 0) {
            int result = (int) (((InputStream) x).read(bArray));
            if (result == -1)
            break;
         }
         FileOutputStream f2 = new FileOutputStream("/tmp/image.jpg");
         f2.write(bArray);
      } 
      else if (p.getContentType().contains("image/")) {
         System.out.println("content type" + p.getContentType());
         File f = new File("image" + new Date().getTime() + ".jpg");
         DataOutputStream output = new DataOutputStream(
            new BufferedOutputStream(new FileOutputStream(f)));
            com.sun.mail.util.BASE64DecoderStream test = 
                 (com.sun.mail.util.BASE64DecoderStream) p
                  .getContent();
         byte[] buffer = new byte[1024];
         int bytesRead;
         while ((bytesRead = test.read(buffer)) != -1) {
            output.write(buffer, 0, bytesRead);
         }
      } 
      else {
         Object o = p.getContent();
         if (o instanceof String) {
            System.out.println("This is a string");
            System.out.println("---------------------------");
            System.out.println((String) o);
         } 
         else if (o instanceof InputStream) {
            System.out.println("This is just an input stream");
            System.out.println("---------------------------");
            InputStream is = (InputStream) o;
            is = (InputStream) o;
            int c;
            while ((c = is.read()) != -1)
               System.out.write(c);
         } 
         else {
            System.out.println("This is an unknown type");
            System.out.println("---------------------------");
            System.out.println(o.toString());
         }
   }

}
   /*
   * This method would print FROM,TO and SUBJECT of the message
   */
   public static void writeEnvelope(Message m) throws Exception {
      System.out.println("This is the message envelope");
      System.out.println("---------------------------");
      Address[] a;

      // FROM
      if ((a = m.getFrom()) != null) {
         for (int j = 0; j < a.length; j++)
         System.out.println("FROM: " + a[j].toString());
      }

      // TO
      if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
         for (int j = 0; j < a.length; j++)
         System.out.println("TO: " + a[j].toString());
      }

      // SUBJECT
      if (m.getSubject() != null)
         System.out.println("SUBJECT: " + m.getSubject());

   }

}

Вы можете включить отладку, раскомментировав оператор emailSession.setDebug (true);

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс FetchingEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: FetchingEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: FetchingEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

messages.length---3
---------------------------------
This is the message envelope
---------------------------
FROM: XYZ <xyz@gmail.com>
TO: ABC <abc@gmail.com>
SUBJECT: Simple Message
----------------------------
CONTENT-TYPE: multipart/alternative; boundary=047d7b343d6ad3e4ea04e8ec6579
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi am a simple message string....

-- 
Regards
xyz

This is the message envelope
---------------------------
FROM: XYZ <xyz@gmail.com>
TO: ABC <abc@gmail.com>
SUBJECT: Attachement
----------------------------
CONTENT-TYPE: multipart/mixed; boundary=047d7b343d6a99180904e8ec6751
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi I've an attachment.Please check

-- 
Regards
XYZ

----------------------------
CONTENT-TYPE: application/octet-stream; name=sample_attachement
This is just an input stream
---------------------------
Submit your Tutorials, White Papers and Articles into our Tutorials Directory. This is a tutorials database where we are keeping all the tutorials shared by the internet community for the benefit of others.


This is the message envelope
---------------------------
FROM: XYZ <[email protected]>
TO: ABC <[email protected]>
SUBJECT: Inline Image
----------------------------
CONTENT-TYPE: multipart/related; boundary=f46d04182582be803504e8ece94b
This is a Multipart
---------------------------

----------------------------
CONTENT-TYPE: text/plain; charset=ISO-8859-1
This is plain text
---------------------------
Hi I've an inline image


[image: Inline image 3]

-- 
Regards
XYZ

----------------------------
CONTENT-TYPE: image/png; name="javamail-mini-logo.png"
content typeimage/png; name="javamail-mini-logo.png"

Здесь вы можете видеть, что в нашем почтовом ящике есть три письма. Сначала простое письмо с сообщением «Привет, я простая строка сообщения ….». Второе письмо имеет вложение. Содержимое вложения также напечатано, как показано выше. Третье письмо имеет встроенное изображение.

Аутентификация

Мы изменим наш CheckingMails.java из главы Проверка электронной почты . Его содержание, как показано ниже:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;

public class CheckingMails {

   public static void check(String host, String storeType, String user,
      String password) 
   {
      try {

      // create properties field
      Properties properties = new Properties();

      properties.put("mail.pop3s.host", host);
      properties.put("mail.pop3s.port", "995");
      properties.put("mail.pop3s.starttls.enable", "true");

      // Setup authentication, get session
      Session emailSession = Session.getInstance(properties,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(
                  "[email protected]", "manisha123");
            }
         });
      // emailSession.setDebug(true);

      // create the POP3 store object and connect with the pop server
      Store store = emailSession.getStore("pop3s");

      store.connect();

      // create the folder object and open it
      Folder emailFolder = store.getFolder("INBOX");
      emailFolder.open(Folder.READ_ONLY);

      // retrieve the messages from the folder in an array and print it
      Message[] messages = emailFolder.getMessages();
      System.out.println("messages.length---" + messages.length);

      for (int i = 0, n = messages.length; i < n; i++) {
         Message message = messages[i];
         System.out.println("---------------------------------");
         System.out.println("Email Number " + (i + 1));
         System.out.println("Subject: " + message.getSubject());
         System.out.println("From: " + message.getFrom()[0]);
         System.out.println("Text: " + message.getContent().toString());
      }

      // close the store and folder objects
      emailFolder.close(false);
      store.close();

      } catch (NoSuchProviderException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {

      String host = "pop.gmail.com";// change accordingly
      String mailStoreType = "pop3";
      String username = "[email protected]";// change accordingly
      String password = "*****";// change accordingly

      check(host, mailStoreType, username, password);

   }

}

Вы можете включить отладку, раскомментировав оператор emailSession.setDebug (true);

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс CheckingMails.java в каталоге: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: CheckingMails.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: CheckingMails

Проверить вывод

Вы можете увидеть похожее сообщение, как показано ниже на командной консоли:

messages.length---3
---------------------------------
Email Number 1
Subject: Today is a nice day
From: XYZ <xyz@gmail.com>
Text: javax.mail.internet.MimeMultipart@45f676cb
---------------------------------
Email Number 2
Subject: hiiii....
From: XYZ <xyz@gmail.com>
Text: javax.mail.internet.MimeMultipart@37f12d4f
---------------------------------
Email Number 3
Subject: helloo
From: XYZ <xyz@gmail.com>
Text: javax.mail.internet.MimeMultipart@3ad5ba3a

Отвечая на электронные письма

В этой главе мы увидим, как отвечать на электронные письма, используя JavaMail API. Основные шаги, выполняемые в программе ниже:

  • Получите объект Session с подробностями POP и SMTP-сервера в свойствах. Нам понадобятся данные POP для получения сообщений и SMTP-данные для отправки сообщений.

  • Создайте объект магазина POP3 и подключитесь к магазину.

  • Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике.

  • Получать сообщения.

  • Просмотрите сообщения и введите «Y» или «y», если хотите ответить.

  • Получить всю информацию (Кому, От, Тема, Содержание) сообщения.

  • Создайте ответное сообщение, используя метод Message.reply (). Этот метод настраивает новое сообщение с соответствующим получателем и темой. Метод принимает логический параметр, указывающий, отвечать ли только отправителю (false) или отвечать всем (true).

  • Установите From, Text и Reply-to в сообщении и отправьте его через экземпляр объекта Transport.

  • Закройте Транспорт, папку и сохраните объекты соответственно.

Получите объект Session с подробностями POP и SMTP-сервера в свойствах. Нам понадобятся данные POP для получения сообщений и SMTP-данные для отправки сообщений.

Создайте объект магазина POP3 и подключитесь к магазину.

Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике.

Получать сообщения.

Просмотрите сообщения и введите «Y» или «y», если хотите ответить.

Получить всю информацию (Кому, От, Тема, Содержание) сообщения.

Создайте ответное сообщение, используя метод Message.reply (). Этот метод настраивает новое сообщение с соответствующим получателем и темой. Метод принимает логический параметр, указывающий, отвечать ли только отправителю (false) или отвечать всем (true).

Установите From, Text и Reply-to в сообщении и отправьте его через экземпляр объекта Transport.

Закройте Транспорт, папку и сохраните объекты соответственно.

Здесь мы использовали сервер JangoSMTP, через который электронные письма отправляются на наш адрес электронной почты. Настройка объясняется в главе « Настройка среды» .

Создать класс Java

Создайте файл Java-класса ReplyToEmail , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class ReplyToEmail {
   public static void main(String args[]) 
   {
      Date date = null;

      Properties properties = new Properties();
      properties.put("mail.store.protocol", "pop3");
      properties.put("mail.pop3s.host", "pop.gmail.com");
      properties.put("mail.pop3s.port", "995");
      properties.put("mail.pop3.starttls.enable", "true");
      properties.put("mail.smtp.auth", "true");
      properties.put("mail.smtp.starttls.enable", "true");
      properties.put("mail.smtp.host", "relay.jangosmtp.net");
      properties.put("mail.smtp.port", "25");
      Session session = Session.getDefaultInstance(properties);

      // session.setDebug(true);
      try 
      {
         // Get a Store object and connect to the current host
         Store store = session.getStore("pop3s");
         store.connect("pop.gmail.com", "[email protected]",
            "*****");//change the user and password accordingly

         Folder folder = store.getFolder("inbox");
         if (!folder.exists()) {
            System.out.println("inbox not found");
               System.exit(0);
         }
         folder.open(Folder.READ_ONLY);

         BufferedReader reader = new BufferedReader(new InputStreamReader(
            System.in));

         Message[] messages = folder.getMessages();
         if (messages.length != 0) {

            for (int i = 0, n = messages.length; i < n; i++) {
               Message message = messages[i];
               date = message.getSentDate();
               // Get all the information from the message
               String from = InternetAddress.toString(message.getFrom());
               if (from != null) {
                  System.out.println("From: " + from);
               }
               String replyTo = InternetAddress.toString(message
	         .getReplyTo());
               if (replyTo != null) {
                  System.out.println("Reply-to: " + replyTo);
               }
               String to = InternetAddress.toString(message
	         .getRecipients(Message.RecipientType.TO));
               if (to != null) {
                  System.out.println("To: " + to);
               }

               String subject = message.getSubject();
               if (subject != null) {
                  System.out.println("Subject: " + subject);
               }
               Date sent = message.getSentDate();
               if (sent != null) {
                  System.out.println("Sent: " + sent);
               }

               System.out.print("Do you want to reply [y/n] : ");
               String ans = reader.readLine();
               if ("Y".equals(ans) || "y".equals(ans)) {

                  Message replyMessage = new MimeMessage(session);
                  replyMessage = (MimeMessage) message.reply(false);
                  replyMessage.setFrom(new InternetAddress(to));
                  replyMessage.setText("Thanks");
                  replyMessage.setReplyTo(message.getReplyTo());

                  // Send the message by authenticating the SMTP server
                  // Create a Transport instance and call the sendMessage
                  Transport t = session.getTransport("smtp");
                  try {
	   	     //connect to the SMTP server using transport instance
		     //change the user and password accordingly	
	             t.connect("abc", "****");
	             t.sendMessage(replyMessage,
                        replyMessage.getAllRecipients());
                  } finally {
                     t.close();
                  }
                  System.out.println("message replied successfully ....");

                  // close the store and folder objects
                  folder.close(false);
                  store.close();

               } else if ("n".equals(ans)) {
                  break;
               }
            }//end of for loop

         } else {
            System.out.println("There is no msg....");
         }

      } catch (Exception e) {
         e.printStackTrace();
      }

   }

}

Вы можете включить отладку, раскомментировав оператор session.setDebug (true);

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс ReplyToEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ReplyToEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ReplyToEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

From: ABC <abc@gmail.com>
Reply-to: abc@trioteksolutions.com
To: XYZ <xyz@gmail.com>
Subject: Hi today is a nice day
Sent: Thu Oct 17 15:58:37 IST 2013
Do you want to reply [y/n] : y
message replied successfully ....

Проверьте почтовый ящик, в который было отправлено письмо. В нашем случае полученное сообщение выглядит так:

JavaMail API Ответить по электронной почте

Пересылка писем

В этой главе мы увидим, как переслать письмо, используя JavaMail API. Основные шаги, выполняемые в программе ниже:

  • Получите объект Session с подробностями POP и SMTP-сервера в свойствах. Нам понадобятся данные POP для получения сообщений и SMTP-данные для отправки сообщений.

  • Создайте объект магазина POP3 и подключитесь к магазину.

  • Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике.

  • Получать сообщения.

  • Перейдите по сообщениям и введите «Y» или «y», если вы хотите переслать.

  • Получить всю информацию (Кому, От, Тема, Содержание) сообщения.

  • Создайте прямое сообщение, работая с частями, составляющими сообщение. Первая часть будет текстом сообщения, а вторая часть будет сообщением для пересылки. Объедините два в составную часть. Затем вы добавляете составную часть к правильно адресованному сообщению и отправляете его.

  • Закройте Транспорт, папку и сохраните объекты соответственно.

Получите объект Session с подробностями POP и SMTP-сервера в свойствах. Нам понадобятся данные POP для получения сообщений и SMTP-данные для отправки сообщений.

Создайте объект магазина POP3 и подключитесь к магазину.

Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике.

Получать сообщения.

Перейдите по сообщениям и введите «Y» или «y», если вы хотите переслать.

Получить всю информацию (Кому, От, Тема, Содержание) сообщения.

Создайте прямое сообщение, работая с частями, составляющими сообщение. Первая часть будет текстом сообщения, а вторая часть будет сообщением для пересылки. Объедините два в составную часть. Затем вы добавляете составную часть к правильно адресованному сообщению и отправляете его.

Закройте Транспорт, папку и сохраните объекты соответственно.

Здесь мы использовали сервер JangoSMTP, через который электронные письма отправляются на наш адрес электронной почты. Настройка объясняется в главе « Настройка среды» .

Создать класс Java

Создайте файл Java-класса ForwardEmail , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.Properties;

import javax.mail.BodyPart;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class ForwardEmail {

   public static void main(String[] args) {
      Properties properties = new Properties();
      properties.put("mail.store.protocol", "pop3");
      properties.put("mail.pop3s.host", "pop.gmail.com");
      properties.put("mail.pop3s.port", "995");
      properties.put("mail.pop3.starttls.enable", "true");
      properties.put("mail.smtp.auth", "true");
      properties.put("mail.smtp.host", "relay.jangosmtp.net");
      properties.put("mail.smtp.port", "25");
      Session session = Session.getDefaultInstance(properties);
      try {
         // session.setDebug(true);
         // Get a Store object and connect to the current host
         Store store = session.getStore("pop3s");
         store.connect("pop.gmail.com", "[email protected]",
            "*****");//change the user and password accordingly

         // Create a Folder object and open the folder
         Folder folder = store.getFolder("inbox");
         folder.open(Folder.READ_ONLY);
         BufferedReader reader = new BufferedReader(new InputStreamReader(
            System.in));
         Message[] messages = folder.getMessages();
         if (messages.length != 0) {

         for (int i = 0, n = messages.length; i < n; i++) {
            Message message = messages[i];
            // Get all the information from the message
            String from = InternetAddress.toString(message.getFrom());
            if (from != null) {
               System.out.println("From: " + from);
            }
            String replyTo = InternetAddress.toString(message
               .getReplyTo());
            if (replyTo != null) {
               System.out.println("Reply-to: " + replyTo);
            }
            String to = InternetAddress.toString(message
               .getRecipients(Message.RecipientType.TO));
            if (to != null) {
               System.out.println("To: " + to);
            }

            String subject = message.getSubject();
            if (subject != null) {
               System.out.println("Subject: " + subject);
            }
            Date sent = message.getSentDate();
            if (sent != null) {
               System.out.println("Sent: " + sent);
            }
            System.out.print("Do you want to reply [y/n] : ");
            String ans = reader.readLine();
            if ("Y".equals(ans) || "y".equals(ans)) {
               Message forward = new MimeMessage(session);
               // Fill in header
               forward.setRecipients(Message.RecipientType.TO,
               InternetAddress.parse(from));
               forward.setSubject("Fwd: " + message.getSubject());
               forward.setFrom(new InternetAddress(to));

               // Create the message part
               MimeBodyPart messageBodyPart = new MimeBodyPart();
               // Create a multipart message
               Multipart multipart = new MimeMultipart();
               // set content
               messageBodyPart.setContent(message, "message/rfc822");
               // Add part to multi part
               multipart.addBodyPart(messageBodyPart);
               // Associate multi-part with message
               forward.setContent(multipart);
               forward.saveChanges();

               // Send the message by authenticating the SMTP server
               // Create a Transport instance and call the sendMessage
               Transport t = session.getTransport("smtp");
               try {
                  //connect to the SMTP server using transport instance
		  //change the user and password accordingly
                  t.connect("abc", "*****");
                  t.sendMessage(forward, forward.getAllRecipients());
               } finally {
                  t.close();
               }

               System.out.println("message forwarded successfully....");

            // close the store and folder objects
            folder.close(false);
            store.close();
            }// end if

         }// end for
   }// end if
   } catch (Exception e) {
      e.printStackTrace();
   }
}

}

Вы можете включить отладку, раскомментировав оператор session.setDebug (true);

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс ForwardEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ForwardEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: ForwardEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

From: ABC <abc@gmail.com>
Reply-to: abc@trioteksolutions.com
To: XYZ <xyz@gmail.com>
Subject: Hi today is a nice day
Sent: Thu Oct 17 15:58:37 IST 2013
Do you want to reply [y/n] : y
message forwarded successfully....

Проверьте почтовый ящик, в который было отправлено письмо. В нашем случае перенаправленное сообщение будет выглядеть так:

Пересылка электронной почты JavaMail APIПересылка электронной почты JavaMail API

Удаление писем

В этой главе мы увидим, как удалить электронную почту с помощью JavaMail API. Удаление сообщений включает в себя работу с флагами, связанными с сообщениями. Существуют разные флаги для разных состояний, некоторые определяются системой, а некоторые определяются пользователем. Предопределенные флаги определены во внутреннем классе Flags.Flag и перечислены ниже:

  • Flags.Flag.ANSWERED

  • Flags.Flag.DELETED

  • Flags.Flag.DRAFT

  • Flags.Flag.FLAGGED

  • Flags.Flag.RECENT

  • Flags.Flag.SEEN

  • Flags.Flag.USER

Flags.Flag.ANSWERED

Flags.Flag.DELETED

Flags.Flag.DRAFT

Flags.Flag.FLAGGED

Flags.Flag.RECENT

Flags.Flag.SEEN

Flags.Flag.USER

Протокол POP поддерживает только удаление сообщений.

Основные шаги, выполняемые в программе удаления:

  • Получите объект Session с подробностями POP и SMTP-сервера в свойствах. Нам понадобятся данные POP для получения сообщений и SMTP-данные для отправки сообщений.

  • Создайте объект магазина POP3 и подключитесь к магазину.

  • Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике в режиме READ_WRITE.

  • Получает сообщения из папки входящих сообщений.

  • Перейдите по сообщениям и введите «Y» или «y», если вы хотите удалить сообщение, вызвав метод setFlag (Flags.Flag.DELETED, true) для объекта Message.

  • Сообщения, помеченные как DELETED, на самом деле не удаляются, пока мы не вызовем метод expunge () для объекта Folder или не закроем папку с expunge, установленным в true.

  • Закройте объект магазина.

Получите объект Session с подробностями POP и SMTP-сервера в свойствах. Нам понадобятся данные POP для получения сообщений и SMTP-данные для отправки сообщений.

Создайте объект магазина POP3 и подключитесь к магазину.

Создайте объект Папка и откройте соответствующую папку в вашем почтовом ящике в режиме READ_WRITE.

Получает сообщения из папки входящих сообщений.

Перейдите по сообщениям и введите «Y» или «y», если вы хотите удалить сообщение, вызвав метод setFlag (Flags.Flag.DELETED, true) для объекта Message.

Сообщения, помеченные как DELETED, на самом деле не удаляются, пока мы не вызовем метод expunge () для объекта Folder или не закроем папку с expunge, установленным в true.

Закройте объект магазина.

Создать класс Java

Создайте файл Java-класса ForwardEmail , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;

import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

public class DeleteEmail {

   public static void delete(String pop3Host, String storeType, String user,
      String password) 
   {
      try 
      {
         // get the session object
         Properties properties = new Properties();
         properties.put("mail.store.protocol", "pop3");
         properties.put("mail.pop3s.host", pop3Host);
         properties.put("mail.pop3s.port", "995");
         properties.put("mail.pop3.starttls.enable", "true");
         Session emailSession = Session.getDefaultInstance(properties);
         // emailSession.setDebug(true);

         // create the POP3 store object and connect with the pop server
         Store store = emailSession.getStore("pop3s");

         store.connect(pop3Host, user, password);

         // create the folder object and open it
         Folder emailFolder = store.getFolder("INBOX");
         emailFolder.open(Folder.READ_WRITE);

         BufferedReader reader = new BufferedReader(new InputStreamReader(
            System.in));
         // retrieve the messages from the folder in an array and print it
         Message[] messages = emailFolder.getMessages();
         System.out.println("messages.length---" + messages.length);
         for (int i = 0; i < messages.length; i++) {
            Message message = messages[i];
            System.out.println("---------------------------------");
            System.out.println("Email Number " + (i + 1));
            System.out.println("Subject: " + message.getSubject());
            System.out.println("From: " + message.getFrom()[0]);

            String subject = message.getSubject();
            System.out.print("Do you want to delete this message [y/n] ? ");
            String ans = reader.readLine();
            if ("Y".equals(ans) || "y".equals(ans)) {
	       // set the DELETE flag to true
	       message.setFlag(Flags.Flag.DELETED, true);
	       System.out.println("Marked DELETE for message: " + subject);
            } else if ("n".equals(ans)) {
	       break;
            }
         }
         // expunges the folder to remove messages which are marked deleted
         emailFolder.close(true);
         store.close();

      } catch (NoSuchProviderException e) {
         e.printStackTrace();
      } catch (MessagingException e) {
         e.printStackTrace();
      } catch (IOException io) {
         io.printStackTrace();
      }
   }

   public static void main(String[] args) {

      String host = "pop.gmail.com";// change accordingly
      String mailStoreType = "pop3";
      String username = "[email protected]";// change accordingly
      String password = "*****";// change accordingly

      delete(host, mailStoreType, username, password);

   }

}

Вы можете включить отладку, раскомментировав оператор emailSession.setDebug (true);

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс DeleteEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: DeleteEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: DeleteEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

messages.length---1
---------------------------------
Email Number 1
Subject: Testing
From: ABC <abc@gmail.com>
Do you want to delete this message [y/n] ? y
Marked DELETE for message: Testing

SMTP-сервер Gmail

Во всех предыдущих главах мы использовали сервер JangoSMTP для отправки электронных писем. В этой главе мы узнаем о SMTP-сервере, предоставляемом Gmail. Gmail (среди прочих) предлагает использовать их общедоступный SMTP-сервер бесплатно.

Подробную информацию о SMTP-сервере Gmail можно найти здесь . Как вы можете видеть в деталях, мы можем использовать соединение TLS или SSL для отправки электронной почты через SMTP-сервер Gmail.

Процедура отправки электронной почты с использованием SMTP-сервера Gmail аналогична описанной в главе « Отправка электронной почты» , за исключением того, что мы изменим хост-сервер. В качестве предварительного условия адрес электронной почты отправителя должен быть активным аккаунтом Gmail. Давайте попробуем пример.

Создать класс Java

Создайте файл Java SendEmailUsingGMailSMTP , содержимое которого приведено ниже:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmailUsingGMailSMTP {
   public static void main(String[] args) {
      // Recipient's email ID needs to be mentioned.
      String to = "[email protected]";//change accordingly

      // Sender's email ID needs to be mentioned
      String from = "[email protected]";//change accordingly
      final String username = "abc";//change accordingly
      final String password = "*****";//change accordingly

      // Assuming you are sending email through relay.jangosmtp.net
      String host = "smtp.gmail.com";

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "587");

      // Get the Session object.
      Session session = Session.getInstance(props,
      new javax.mail.Authenticator() {
         protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(username, password);
         }
      });

      try {
         // Create a default MimeMessage object.
         Message message = new MimeMessage(session);

         // Set From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // Set To: header field of the header.
         message.setRecipients(Message.RecipientType.TO,
         InternetAddress.parse(to));

         // Set Subject: header field
         message.setSubject("Testing Subject");

         // Now set the actual message
         message.setText("Hello, this is sample for to check send "
            + "email using JavaMailAPI ");

         // Send message
         Transport.send(message);

         System.out.println("Sent message successfully....");

      } catch (MessagingException e) {
            throw new RuntimeException(e);
      }
   }
}

Здесь хост установлен как smtp.gmail.com, а порт — как 587 . Здесь мы включили соединение TLS.

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс SendEmailUsingGMailSMTP.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmailUsingGMailSMTP.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmailUsingGMailSMTP

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

Sent message successfully....

Управление папками

До сих пор мы работали в наших предыдущих главах в основном с папкой INBOX. Это папка по умолчанию, в которой находится большая часть почты. Некоторые системы могут называть его как INBOX, а другие могут называть его другим именем. Но вы всегда можете получить к нему доступ через API JavaMail, используя имя INBOX.

JavaMail API представляет папки как экземпляры абстрактного класса Folder:

public abstract class Folder extends Object

Этот класс объявляет методы для запроса именованных папок с серверов, удаления сообщений из папок, поиска определенных сообщений в папках, перечисления сообщений в папке и т. Д.

Открытие папки

Мы не можем создать папку напрямую, так как единственный конструктор в классе Folder защищен . Мы можем получить папку из:

  • сессия

  • магазин

  • или другая папка

сессия

магазин

или другая папка

Все вышеперечисленные классы имеют похожий метод getFolder () с похожей подписью:

public abstract Folder getFolder(String name) throws MessagingException

Некоторые методы, которые помогают в получении объекта Folder :

метод Описание
логическое существует () Проверяет, действительно ли папка существует. Используйте этот метод перед получением объекта Folder.
аннотация void open (режим int) Когда вы получаете папку , она закрыта. Используйте этот метод, чтобы открыть его. режим может быть Folder.READ_ONLY или Folder.READ_WRITE.
абстрактный логический isOpen () Этот метод возвращает истину, если папка открыта, ложь, если она закрыта
абстрактный void закрыть (логическое выражение) Закрывает папку. Если аргумент expunge имеет значение true , все удаленные сообщения в папке удаляются из фактического файла на сервере. В противном случае они просто помечаются как удаленные , но сообщения все еще можно восстановить.

Основная информация о папке

Ниже приведены некоторые методы класса Folder, которые возвращают основную информацию о папке:

метод Описание
абстрактная строка getName () Возвращает имя папки, например, «TutorialsPoint Mail»
абстрактная строка getFullName () Возвращает полное иерархическое имя из корня, например «books / Manisha / TutorialsPoint Mail».
URLName getURLName () Вернуть URLName, представляющее эту папку.
абстрактный папка getParent () Возвращает имя папки, которая содержит эту папку, т.е. родительскую папку. Например, «Manisha» из предыдущего примера «TutorialsPoint Mail».
abstract int getType () Возвращает int, указывающий, может ли папка содержать сообщения и / или другие папки.
int getMode () Возвращает одну из двух именованных констант Folder.READ_ONLY или Folder.READ_WRITE или -1, если режим неизвестен.
Магазин getStore () Возвращает объект Store, из которого была извлечена эта папка.
абстрактный символ getSeparator () Вернуть символ разделителя, который отделяет путь к этой папке от имен ближайших подпапок.

Управление папкой

Ниже приведены некоторые методы, которые помогают управлять папкой:

метод Описание
абстрактное логическое создание (тип int) Это создаст новую папку в хранилище этой папки. Где тип будет: Folder.HOLDS_MESSAGES или Folder.HOLDS_FOLDERS. Возвращает true, если папка успешно создана, иначе возвращает false .
абстрактный логический удалить (булев рекурс) Это удаляет папку, только если папка закрыта. В противном случае он создает исключение IllegalStateException . Если значение recurse равно true , подпапки удаляются.
абстрактный логическое переименование (папка f) Это меняет имя этой папки. Папка должна быть закрыта для переименования. В противном случае создается исключение IllegalStateException.

Управление сообщениями в папках

Ниже приведены некоторые методы, которые помогают управлять сообщениями в папке:

метод Описание
abstract void appendMessages (Message [] messages) Как следует из названия, сообщения в массиве размещаются в конце этой папки.
void copyMessages (сообщения [] сообщения, назначение папки) Это копирует сообщения из этой папки в указанную папку, заданную в качестве аргумента.
абстрактное сообщение [] expunge () Чтобы удалить сообщение из папки, установите для его флага Flags.Flag.DELETED значение true. Чтобы физически удалить удаленные сообщения из папки, вы должны вызвать этот метод.

Перечисление содержимого папки

Существует четыре способа составления списка папок, которые содержит папка:

метод Описание
Папка [] list () Это возвращает массив, перечисляющий папки, которые содержит эта папка.
Папка [] listSubscribeed () Это возвращает массив, перечисляющий все подписанные папки, которые содержит эта папка.
абстрактный список папок [] (строковый шаблон) Это похоже на метод list () за исключением того, что он позволяет вам указать шаблон. Шаблон представляет собой строку, в которой указаны имена соответствующих папок.
Папка [] listSubscribeed (образец строки) Это похоже на метод listSubscribeed () за исключением того, что он позволяет вам указать шаблон. Шаблон представляет собой строку, в которой указаны имена соответствующих папок.

Проверка на почту

метод Описание
abstract int getMessageCount () Этот метод может быть вызван в открытой или закрытой папке. Однако в случае закрытой папки этот метод может (или не может) возвращать -1, чтобы указать, что точное количество сообщений не всегда легко доступно.
абстрактный логический hasNewMessages () Возвращает значение true, если новые сообщения были добавлены в папку с момента ее последнего открытия.
int getNewMessageCount () Он возвращает счетчик новых сообщений, проверяя сообщения в папке, для которой установлен флаг RECENT.
int getUnreadMessageCount () Это может быть вызвано в открытой или закрытой папке. Однако в случае закрытой папки он может возвращать -1, чтобы указать, что реальный ответ будет слишком дорогим для получения.

Получение сообщений из папок

Класс Folder предоставляет четыре метода для получения сообщений из открытых папок:

метод Описание
абстрактное сообщение getMessage (int messageNumber) Это возвращает n-е сообщение в папке. Первое сообщение в папке номер 1.
Сообщение [] getMessages () Это возвращает массив объектов Message, представляющих все сообщения в этой папке.
Сообщение [] getMessages (int start, int end) Это возвращает массив объектов Message из папки, начиная с начала и заканчивая концом включительно.
Сообщение [] getMessages (int [] messageNumbers) Это возвращает массив, содержащий только те сообщения, которые конкретно определены по номеру в массиве messageNumbers .
void fetch (Message [] messages, FetchProfile fp) Предварительная выборка элементов, указанных в FetchProfile для данных сообщений. Аргумент FetchProfile указывает, какие заголовки в сообщениях следует предварительно выбирать.

Поиск папок

Если сервер поддерживает поиск (как это делают многие серверы IMAP, а большинство серверов POP — нет), можно легко найти в папке сообщения, отвечающие определенным критериям. Критерии закодированы в объектах SearchTerm. Ниже приведены два метода поиска:

метод Описание
Поиск сообщения [] (термин SearchTerm) Поиск в этой папке сообщений, соответствующих указанному критерию поиска. Возвращает массив, содержащий соответствующие сообщения. Возвращает пустой массив, если совпадений не найдено.
Поиск сообщения [] (термин SearchTerm, сообщения Message []) Поиск в указанном массиве сообщений для тех, которые соответствуют указанному критерию поиска. Возвращает массив, содержащий соответствующие сообщения. Возвращает пустой массив, если совпадений не найдено. Указанные объекты сообщения должны принадлежать этой папке.

Флаги

Изменение флага полезно, когда вам нужно изменить флаги для всего набора сообщений в папке. Ниже приведены методы, предоставляемые в классе Folder:

метод Описание
void setFlags (сообщения Message [], флаг Flags, логическое значение) Устанавливает указанные флаги в сообщениях, указанных в массиве.
void setFlags (int start, int end, флаг Flags, логическое значение) Устанавливает указанные флаги для сообщений, пронумерованных от начала до конца, включая начало и конец включительно.
void setFlags (int [] messageNumbers, флаг Flags, логическое значение) Устанавливает указанные флаги для сообщений, номера сообщений которых находятся в массиве.
абстрактные флаги getPermanentFlags () Возвращает флаги, которые эта папка поддерживает для всех сообщений.

Управление квотами

Квота в JavaMail — это ограниченное или фиксированное количество или количество сообщений в почтовом хранилище. Каждый запрос почтовой службы учитывается в квоте вызовов JavaMail API. Служба электронной почты может применять следующий критерий квоты:

  • Максимальный размер исходящих почтовых сообщений, включая вложения.

  • Максимальный размер входящих почтовых сообщений, включая вложения.

  • Максимальный размер сообщения, когда администратор является получателем

Максимальный размер исходящих почтовых сообщений, включая вложения.

Максимальный размер входящих почтовых сообщений, включая вложения.

Максимальный размер сообщения, когда администратор является получателем

Для управления квотами JavaMail имеет следующие классы:

Учебный класс Описание
общедоступная квота Этот класс представляет набор квот для данного корня квоты. Каждый корень квоты имеет набор ресурсов, представленных классом Quota.Resource. Каждый ресурс имеет имя (например, «ХРАНЕНИЕ»), текущее использование и ограничение использования. У него есть только один метод setResourceLimit (имя строки, длинный лимит) .
открытый статический класс Quota.Resource Представляет отдельный ресурс в корне квоты.
открытый интерфейс QuotaAwareStore Интерфейс, реализованный магазинами, которые поддерживают квоты. Методы getQuota и setQuota поддерживают модель квот, определенную расширением IMAP QUOTA. GmailSSLStore, GmailStore, IMAPSSLStore, IMAPStore являются известными классами реализации этого интерфейса.

Давайте посмотрим и пример в следующих разделах, который проверяет имя хранилища почты, лимит и его использование.

Создать класс Java

Создайте файл Java-класса QuotaExample , содержимое которого выглядит следующим образом:

package com.tutorialspoint;

import java.util.Properties;

import javax.mail.Quota;
import javax.mail.Session;
import javax.mail.Store;

import com.sun.mail.imap.IMAPStore;

public class QuotaExample 
{
   public static void main(String[] args) 
   {
      try 
      {
         Properties properties = new Properties();
         properties.put("mail.store.protocol", "imaps");
         properties.put("mail.imaps.port", "993");
         properties.put("mail.imaps.starttls.enable", "true");
         Session emailSession = Session.getDefaultInstance(properties);
         // emailSession.setDebug(true);

         // create the IMAP3 store object and connect with the pop server
         Store store = emailSession.getStore("imaps");

         //change the user and password accordingly
         store.connect("imap.gmail.com", "[email protected]", "*****");
         IMAPStore imapStore = (IMAPStore) store;
         System.out.println("imapStore ---" + imapStore);

         //get quota
         Quota[] quotas = imapStore.getQuota("INBOX");
         //Iterate through the Quotas
         for (Quota quota : quotas) {
            System.out.println(String.format("quotaRoot:'%s'",
               quota.quotaRoot));
            //Iterate through the Quota Resource
            for (Quota.Resource resource : quota.resources) {
               System.out.println(String.format(
                  "name:'%s', limit:'%s', usage:'%s'", resource.name,
                  resource.limit, resource.usage));
            }
         }
      } catch (Exception e) 
      {
         e.printStackTrace();
      }
   }
}

Вот подключение к службе Gmail через сервер IMAP (imap.gmail.com), так как IMAPStore реализует QuotaAwareStore. Как только вы получите объект Store, извлеките массив Quota, итерируйте его и напечатайте соответствующую информацию.

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс QuotaExample.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: QuotaExample.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: QuotaExample

Проверить вывод

Вы должны увидеть похожее сообщение в командной консоли:

 imapStore --- imaps: //abc%[email protected]
 quotaRoot: ''
 имя: «ХРАНЕНИЕ», лимит: «15728640», использование: «513»

Отказов сообщения

Сообщение может быть отклонено по нескольким причинам. Эта проблема подробно обсуждается на rfc1211 . Только сервер может определить наличие определенного почтового ящика или имени пользователя. Когда сервер обнаружит ошибку, он вернет сообщение с указанием причины сбоя отправителю исходного сообщения.

Существует множество интернет-стандартов, касающихся уведомлений о состоянии доставки, но большое количество серверов не поддерживают эти новые стандарты, а используют специальные методы для возврата таких сообщений об ошибках. Следовательно, становится очень трудно соотнести отклоненное сообщение с исходным сообщением, вызвавшим проблему.

JavaMail включает в себя поддержку анализа уведомлений о состоянии доставки. Существует ряд методов и эвристик для решения этой проблемы. Одним из методов является путь возврата переменной оболочки. Вы можете установить обратный путь в разработчике, как показано в примере ниже. Это адрес, на который отправляются письма с отказами. Возможно, вы захотите установить для него общий адрес, отличный от заголовка From :, чтобы вы могли обрабатывать удаленные отскоки. Это делается путем установки свойства mail.smtp.from в JavaMail.

Создать класс Java

Создайте файл java класса SendEmail , содержимое которого выглядит следующим образом:

import java.util.Properties;

import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
   public static void main(String[] args) throws Exception {
      String smtpServer = "smtp.gmail.com";
      int port = 587;
      final String userid = "youraddress";//change accordingly
      final String password = "*****";//change accordingly
      String contentType = "text/html";
      String subject = "test: bounce an email to a different address " +
				"from the sender";
      String from = "[email protected]";
      String to = "[email protected]";//some invalid address
      String bounceAddr = "[email protected]";//change accordingly
      String body = "Test: get message to bounce to a separate email address";

      Properties props = new Properties();

      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", smtpServer);
      props.put("mail.smtp.port", "587");
      props.put("mail.transport.protocol", "smtp");
      props.put("mail.smtp.from", bounceAddr);

      Session mailSession = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(userid, password);
            }
         });

      MimeMessage message = new MimeMessage(mailSession);
      message.addFrom(InternetAddress.parse(from));
      message.setRecipients(Message.RecipientType.TO, to);
      message.setSubject(subject);
      message.setContent(body, contentType);

      Transport transport = mailSession.getTransport();
      try {
         System.out.println("Sending ....");
         transport.connect(smtpServer, port, userid, password);
         transport.sendMessage(message,
            message.getRecipients(Message.RecipientType.TO));
         System.out.println("Sending done ...");
      } catch (Exception e) {
         System.err.println("Error Sending: ");
         e.printStackTrace();

      }
      transport.close();
   }// end function main()
}

Здесь мы видим, что свойство mail.smtp.from установлено отличным от адреса from .

Скомпилируйте и запустите

Теперь, когда наш класс готов, давайте скомпилируем вышеуказанный класс. Я сохранил класс SendEmail.java в каталог: / home / manisha / JavaMailAPIExercise . Нам понадобятся jars javax.mail.jar и активации.jar в пути к классам. Выполните приведенную ниже команду, чтобы скомпилировать класс (оба файла jar находятся в каталоге / home / manisha /) из командной строки:

javac -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail.java

Теперь, когда класс скомпилирован, выполните следующую команду:

java -cp /home/manisha/activation.jar:/home/manisha/javax.mail.jar: SendEmail

Проверить вывод

Вы должны увидеть следующее сообщение в командной консоли:

Sending ....
Sending done ...

SMTP-серверы

SMTP — это сокращение от Simple Mail Transfer Protocol . Это Интернет-стандарт для передачи электронной почты (электронной почты) по сетям Интернет-протокола (IP). SMTP использует TCP-порт 25. SMTP-соединения, защищенные с помощью SSL, известны по сокращенному протоколу SMTPS, хотя SMTPS сам по себе не является протоколом.

JavaMail API имеет пакет com.sun.mail.smtp, который действует как поставщик протокола SMTP для доступа к SMTP-серверу. В следующей таблице перечислены классы, включенные в этот пакет:

Учебный класс Описание
SMTPMessage Этот класс является специализацией класса MimeMessage, который позволяет указывать различные параметры и параметры SMTP, которые будут использоваться при отправке этого сообщения через SMTP.
SMTPSSLTransport Этот класс реализует абстрактный класс транспорта, используя SMTP через SSL для отправки и передачи сообщений.
SMTPTransport Этот класс реализует абстрактный класс транспорта с использованием SMTP для отправки и передачи сообщений.

В следующей таблице перечислены сгенерированные исключения:

исключение Описание
SMTPAddressFailedException Это исключение выдается, когда сообщение не может быть отправлено.
SMTPAddressSucceededException Это исключение связано с SendFailedException, если свойство mail.smtp.reportsuccess имеет значение true.
SMTPSenderFailedException Это исключение выдается, когда сообщение не может быть отправлено.
SMTPSendFailedException Это исключение выдается, когда сообщение не может быть отправлено. Исключением является адрес отправителя, который почтовый сервер отклонил.

Поставщик com.sun.mail.smtp дополнительно может использовать аутентификацию SMTP. Чтобы использовать SMTP-аутентификацию, вам нужно установить свойство mail.smtp.auth или предоставить SMTP-транспорту имя пользователя и пароль при подключении к SMTP-серверу. Вы можете сделать это, используя один из следующих подходов:

  • Укажите объект Authenticator при создании почтового сеанса и укажите имя пользователя и пароль во время обратного вызова Authenticator. Свойство mail.smtp.user может быть установлено для предоставления имени пользователя по умолчанию для обратного вызова, но пароль все равно необходимо будет указать явно. Этот подход позволяет использовать статический метод отправки транспорта для отправки сообщений. Например:

Укажите объект Authenticator при создании почтового сеанса и укажите имя пользователя и пароль во время обратного вызова Authenticator. Свойство mail.smtp.user может быть установлено для предоставления имени пользователя по умолчанию для обратного вызова, но пароль все равно необходимо будет указать явно. Этот подход позволяет использовать статический метод отправки транспорта для отправки сообщений. Например:

Transport.send(message);
  • Вызовите метод транспортного соединения явно с аргументами имени пользователя и пароля. Например:

    Transport tr = session.getTransport("smtp");
    tr.connect(smtphost, username, password);
    msg.saveChanges();
    tr.sendMessage(msg, msg.getAllRecipients());
    tr.close();

  • Вызовите метод транспортного соединения явно с аргументами имени пользователя и пароля. Например:

    Поставщик протокола SMTP поддерживает следующие свойства, которые могут быть установлены в объекте сеанса JavaMail. Свойства всегда задаются как строки. Например:

     props.put("mail.smtp.port", "587");

    IMAP-серверы

    IMAP — сокращение от Internet Access Access Protocol . Это интернет-протокол прикладного уровня, который позволяет почтовому клиенту получать доступ к электронной почте на удаленном почтовом сервере. IMAP-сервер обычно прослушивает общеизвестный порт 143. IMAP через SSL (IMAPS) назначается порту 993.

    IMAP поддерживает как онлайн, так и автономный режимы работы. Почтовые клиенты, использующие IMAP, обычно оставляют сообщения на сервере, пока пользователь явно не удалит их.

    Пакет com.sun.mail.imap является поставщиком протокола IMAP для API JavaMail, который предоставляет доступ к хранилищу сообщений IMAP. В таблице ниже перечислены интерфейс и классы этого провайдера:

    Класс / Интерфейс Описание
    IMAPFolder.ProtocolCommand Это простой интерфейс для пользовательских команд протокола IMAP.
    ACL Это класс. Запись списка контроля доступа для определенного идентификатора аутентификации (пользователя или группы).
    IMAPFolder Этот класс реализует папку IMAP.
    IMAPFolder.FetchProfileItem Этот класс для получения заголовков.
    IMAPMessage Этот класс реализует объект ReadableMime.
    IMAPMessage.FetchProfileCondition Этот класс реализует тест для каждого сообщения в папке.
    IMAPSSLStore Этот класс обеспечивает доступ к хранилищу сообщений IMAP через SSL.
    IMAPStore Этот класс обеспечивает доступ к хранилищу сообщений IMAP.
    права Этот класс представляет набор прав для идентификатора аутентификации (например, пользователя или группы).
    Rights.Right Этот внутренний класс представляет индивидуальное право.
    SortTerm Определенные критерии сортировки, определенные в RFC 5256.

    Некоторые моменты, которые следует отметить выше этого поставщика:

    • Этот поставщик поддерживает протоколы IMAP4 и IMAP4rev1.

    • Подключенное IMAPStore поддерживает пул объектов протокола IMAP для использования при обмене данными с сервером IMAP. Когда папки открываются и необходимы новые объекты протокола IMAP, IMAPStore предоставит их из пула соединений или создаст их, если их нет. Когда папка закрыта, ее объект протокола IMAP возвращается в пул соединений, если этот пул.

    • Подключенный объект IMAPStore может поддерживать или не поддерживать отдельный объект протокола IMAP, который предоставляет хранилище выделенное соединение с сервером IMAP.

    Этот поставщик поддерживает протоколы IMAP4 и IMAP4rev1.

    Подключенное IMAPStore поддерживает пул объектов протокола IMAP для использования при обмене данными с сервером IMAP. Когда папки открываются и необходимы новые объекты протокола IMAP, IMAPStore предоставит их из пула соединений или создаст их, если их нет. Когда папка закрыта, ее объект протокола IMAP возвращается в пул соединений, если этот пул.

    Подключенный объект IMAPStore может поддерживать или не поддерживать отдельный объект протокола IMAP, который предоставляет хранилище выделенное соединение с сервером IMAP.

    POP3 серверы

    Почтовый протокол (POP) — это стандартный интернет-протокол прикладного уровня, используемый локальными почтовыми клиентами для получения электронной почты с удаленного сервера через соединение TCP / IP. POP поддерживает простые требования загрузки и удаления для доступа к удаленным почтовым ящикам. Сервер POP3 прослушивает известный порт 110.

    Пакет com.sun.mail.pop3 является поставщиком протокола POP3 для API JavaMail, который обеспечивает доступ к хранилищу сообщений POP3. В таблице ниже перечислены классы в этом пакете:

    название Описание
    POP3Folder Папка POP3 (может быть только «INBOX»).
    POP3Message Сообщение POP3.
    POP3SSLStore Хранилище сообщений POP3 с использованием SSL.
    POP3Store Магазин сообщений POP3.

    Некоторые моменты, которые следует отметить выше этого поставщика:

    Поставщик POP3 поддерживает только одну папку с именем INBOX . Из-за ограничений протокола POP3 многие функции JavaMail API, такие как уведомление о событиях, управление папками, управление флагами и т. Д., Не допускаются.

    Доступ к поставщику POP3 осуществляется через API JavaMail с помощью имени протокола pop3 или URL-адреса в виде pop3: // user: password @ host: port / INBOX « .

    POP3 не поддерживает постоянных флагов. Например, флаг Flags.Flag.RECENT никогда не будет установлен для сообщений POP3. Приложение должно определить, какие сообщения в почтовом ящике POP3 являются новыми .

    POP3 не поддерживает метод Folder.expunge (). Чтобы удалить и удалить сообщения, установите флаг Flags.Flag.DELETED на сообщениях и закройте папку, используя метод Folder.close (true).

    POP3 не предоставляет полученную дату , поэтому метод getReceivedDate вернет значение null.

    При обращении к заголовкам сообщения POP3 поставщик POP3 использует команду TOP для извлечения всех заголовков, которые затем кэшируются.

    Когда осуществляется доступ к содержимому сообщения POP3, поставщик POP3 использует команду RETR для получения всего сообщения.

    Метод POP3Message.invalidate можно использовать для аннулирования кэшированных данных без закрытия папки.