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

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

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

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

  • SMTP: Акроним для Simple Mail Transfer Protocol. Он предоставляет механизм для доставки электронной почты.

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

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

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

  • NNTP and Others: Есть много протоколов, предоставляемых сторонними поставщиками. Некоторые из них - протокол передачи сетевых новостей (NNTP), безопасные многоцелевые расширения почты Интернета (S / MIME) и т. Д.

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

Архитектура

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

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

  • Не зависящая от приложения часть: интерфейс прикладного программирования (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.

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

SMTP сервер

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

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

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

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

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

API JavaMail состоит из некоторых интерфейсов и классов, используемых для отправки, чтения и удаления сообщений электронной почты. Хотя в 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] или Personal Name <[email protected]> .

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

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

  • Получить сеанс

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

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

    message.setText("your text goes here");
  • Отправьте сообщение с помощью транспортного объекта.

Создать класс 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. Мы должны были бы банки javax.mail.jar и activation.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 будет получено следующее письмо:

Вот пример отправки электронного письма с вложением с вашего компьютера. Файл на локальном компьютере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);
  • Отправьте сообщение с помощью транспортного объекта.

Создать класс 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. Мы должны были бы банки javax.mail.jar и activation.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 будет получено следующее письмо:

Вот пример отправки электронного письма в формате 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");
  • Отправьте сообщение с помощью транспортного объекта.

Создать класс 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. Мы должны были бы банки javax.mail.jar и activation.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 будет получено следующее письмо:

Вот пример отправки электронного письма в формате 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);
  • Отправьте сообщение с помощью транспортного объекта.

Создать класс 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. Мы должны были бы банки javax.mail.jar и activation.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 будет получено следующее письмо:

Перед тем, как перейти к этой главе, необходимо понять два аспекта. Они естьCheck и Fetch.

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

  • FetchОтправка электронного письма в JavaMail - это процесс, при котором мы открываем соответствующую папку в почтовом ящике и получаем каждое сообщение. Вместе с заголовком мы также читаем контент, распознавая тип контента.

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

  • Получить сеанс

  • Создайте объект pop3 Store и подключитесь к pop серверу.

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

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

  • Закройте объекты 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. Мы должны были бы банки javax.mail.jar и activation.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: <[email protected]>
Text: javax.mail.internet.MimeMultipart@327a5b7f
---------------------------------
Email Number 2
Subject: testing ----checking simple email
From: <[email protected]>
Text: javax.mail.internet.MimeMultipart@7f0d08bc
---------------------------------
Email Number 3
Subject: Email with attachment
From: <[email protected]>
Text: javax.mail.internet.MimeMultipart@30b8afce
---------------------------------
Email Number 4
Subject: Email with Inline image
From: <[email protected]>
Text: javax.mail.internet.MimeMultipart@2d1e165f

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

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

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

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

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

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

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

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

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

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

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

Создать класс 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. Мы должны были бы банки javax.mail.jar и activation.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 <[email protected]>
TO: ABC <[email protected]>
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 <[email protected]>
TO: ABC <[email protected]>
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. Мы должны были бы банки javax.mail.jar и activation.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 <[email protected]>
Text: javax.mail.internet.MimeMultipart@45f676cb
---------------------------------
Email Number 2
Subject: hiiii....
From: XYZ <[email protected]>
Text: javax.mail.internet.MimeMultipart@37f12d4f
---------------------------------
Email Number 3
Subject: helloo
From: XYZ <[email protected]>
Text: javax.mail.internet.MimeMultipart@3ad5ba3a

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

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

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

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

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

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

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

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

  • Задайте в сообщении «От», «Текст» и «Ответить» и отправьте его через экземпляр транспортного объекта.

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

Здесь мы использовали сервер 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. Мы должны были бы банки javax.mail.jar и activation.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 <[email protected]>
Reply-to: [email protected]
To: XYZ <[email protected]>
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. Основные шаги, выполняемые в приведенной ниже программе:

  • Получите объект 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. Мы должны были бы банки javax.mail.jar и activation.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 <[email protected]>
Reply-to: [email protected]
To: XYZ <[email protected]>
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. Удаление сообщений включает работу с флагами, связанными с сообщениями. Существуют разные флаги для разных состояний, некоторые из которых определены системой, а некоторые определены пользователем. Предопределенные флаги определены во внутреннем классе Flags.Flag и перечислены ниже:

  • 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.

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

Создать класс 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. Мы должны были бы банки javax.mail.jar и activation.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 <[email protected]>
Do you want to delete this message [y/n] ? y
Marked DELETE for message: Testing

Во всех предыдущих главах мы использовали сервер 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. Мы должны были бы банки javax.mail.jar и activation.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, а некоторые другие могут называть его другим именем. Но вы всегда можете получить к нему доступ из JavaMail API, используя имя INBOX.

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

public abstract class Folder extends Object

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

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

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

  • сессия

  • склад

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

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

public abstract Folder getFolder(String name) throws MessagingException

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

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

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

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

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

Папка управления

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

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

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

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

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

Список содержимого папки

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

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

Проверка почты

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

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

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

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

Поиск в папках

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

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

Флаги

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

Метод Описание
void setFlags (сообщения [] сообщения, флаг флагов, логическое значение) Устанавливает указанные флаги для сообщений, указанных в массиве.
void setFlags (int start, int end, флаг флагов, логическое значение) Устанавливает указанные флаги для сообщений, пронумерованных от начала до конца, включая начало и конец.
void setFlags (int [] messageNumbers, флаг флагов, логическое значение) Устанавливает указанные флаги для сообщений, номера сообщений которых находятся в массиве.
абстрактные флаги 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. Мы должны были бы банки javax.mail.jar и activation.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:''
name:'STORAGE', limit:'15728640', usage:'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. Мы должны были бы банки javax.mail.jar и activation.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 - это аббревиатура от Simple Mail Transfer Protocol. Это Интернет-стандарт для передачи электронной почты (e-mail) через сети Интернет-протокола (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 Transport имя пользователя и пароль при подключении к SMTP-серверу. Вы можете сделать это одним из следующих способов:

  • Предоставьте объект 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 - это аббревиатура от Internet Message Access Protocol. Это Интернет-протокол прикладного уровня, который позволяет почтовому клиенту получать доступ к электронной почте на удаленном почтовом сервере. Сервер IMAP обычно прослушивает хорошо известный порт 143. IMAP через SSL (IMAPS) назначается порту 993.

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

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

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

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

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

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

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

Почтовый протокол (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 многие возможности API JavaMail, такие как уведомление о событиях, управление папками, управление флагами и т. Д., Не разрешены.

  • Доступ к провайдеру 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 можно использовать для аннулирования кешированных данных без закрытия папки.