JavaMailAPI-クイックガイド

JavaMail APIは、メールおよびメッセージングアプリケーションを構築するための、プラットフォームおよびプロトコルに依存しないフレームワークを提供します。JavaMail APIは、メールシステムを構成するオブジェクトを定義する一連の抽象クラスを提供します。これは、電子メッセージの読み取り、作成、および送信のためのオプションのパッケージ(標準拡張)です。

JavaMailは、システムコンポーネントやインターフェイスなど、メッセージングシステムへのインターフェイスを構築するために使用される要素を提供します。この仕様では特定の実装は定義されていませんが、JavaMailには、RFC822およびMIMEインターネットメッセージング標準を実装するいくつかのクラスが含まれています。これらのクラスは、JavaMailクラスパッケージの一部として提供されます。

以下は、JavaMailAPIでサポートされているプロトコルの一部です。

  • SMTP:の頭字語 Simple Mail Transfer Protocol。電子メールを配信するメカニズムを提供します。

  • POP:の頭字語 Post Office Protocol。POPは、インターネット上のほとんどの人がメールを取得するために使用するメカニズムです。これは、ユーザーごとに1つのメールボックスのサポートを定義します。RFC 1939は、このプロトコルを定義しています。

  • IMAP:の頭字語 Internet Message Access Protocol。これは、メッセージを受信するための高度なプロトコルです。メールボックスは複数のユーザーで共有できることに加えて、ユーザーごとに複数のメールボックスをサポートします。RFC2060で定義されています。

  • MIME:の頭字語 Multipurpose Internet Mail Extensions。。メール転送プロトコルではありません。代わりに、転送される内容(メッセージの形式、添付ファイルなど)を定義します。ここで有効になるさまざまなドキュメントがあります:RFC 822、RFC 2045、RFC 2046、およびRFC2047。JavaMailAPIのユーザーとして、通常、これらの形式について心配する必要はありません。ただし、これらの形式は存在し、プログラムで使用されます。

  • NNTP and Others:サードパーティプロバイダーによって提供される多くのプロトコルがあります。それらのいくつかは、ネットワークニュース転送プロトコル(NNTP)、安全な多目的インターネットメール拡張機能(S / MIME)などです。

これらの詳細については、以降の章で説明します。

建築

上記のように、JavaアプリケーションはJavaMail APIを使用して電子メールを作成、送信、および受信します。次の図は、JavaMailのアーキテクチャを示しています。

JavaMail APIの抽象メカニズムは、JDBC、JNDI、JMSなどの他のJ2EEAPIに似ています。上記のアーキテクチャ図に見られるように、JavaMailAPIは2つの主要な部分に分かれています。

  • アプリケーションに依存しない部分:アプリケーションプログラミングインターフェイス(API)は、使用される基になるプロバイダーやプロトコルに関係なく、メールメッセージを送受信するためにアプリケーションコンポーネントによって使用されます。

  • サービスに依存する部分:サービスプロバイダーインターフェイス(SPI)は、SMTP、POP、IMAP、ネットワークニュース転送プロトコル(NNTP)などのプロトコル固有の言語を話します。これは、電子メールサービスのプロバイダーをJ2EEプラットフォームに接続するために使用されます。

Javaアプリケーションを使用して電子メールを送信するのは簡単ですが、最初に必要なのは JavaMail API そして Java Activation Framework (JAF) マシンにインストールされています。

あなたは必要になります JavaBeans Activation Framework (JAF)Java SE6以降を使用していない場合にのみjavax.activationパッケージを提供する拡張機能 。
  • JavaMailの最新バージョン(バージョン1.5.0)は、Javaの標準Webサイトからダウンロードできます。

  • JAFの最新バージョン(バージョン1.1.1)は、Javaの標準Webサイトからダウンロードできます。

これらのファイルをダウンロードして解凍します。新しく作成されたトップレベルのディレクトリに、両方のアプリケーション用の多数のjarファイルがあります。追加する必要がありますmail.jar そして activation.jar CLASSPATH内のファイル。

SMTPサーバー

メールを送信するには、メールの送信を担当するSMTPサーバーが必要です。次のいずれかの手法を使用して、SMTPサーバーを取得できます。

  • Postfixサーバー(Ubuntu用)、Apache Jamesサーバー(Java Apache Mail Enterprise Server)などのSMTPサーバーをインストールして使用します。(または)

  • たとえば、ホストプロバイダーが提供するSMTPサーバーを使用します。JangoSMTPサイトが提供する無料のSMTPはrelay.jangosmtp.net(または)です。

  • Gmail、yahooなどの企業が提供するSMTPサーバーを使用します。

以降の章の例では、無料のJangoSMTPサーバーを使用して電子メールを送信しました。このサイトにアクセスしてアカウントを作成し、メールアドレスを設定できます。

JavaMail APIは、電子メールメッセージの送信、読み取り、および削除に使用されるいくつかのインターフェースとクラスで構成されています。JavaMail APIには多くのパッケージがありますが、Java Mail APIで頻繁に使用される主な2つのパッケージ、javax.mailjavax.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の構文を使用してインターネットの電子メールアドレスを表します。一般的なアドレス構文は、user @ host.domainまたはPersonalName <[email protected]>の形式です

簡単なメールを送信する例を次に示します。ここでは、宛先の電子メールアドレスに電子メールを送信するためのJangoSMTPサーバーを使用しました。セットアップについては、「環境セットアップ」の章で説明しています。

簡単なメールを送信するには、次の手順に従います。

  • セッションを取得する

  • デフォルトのMimeMessageオブジェクトを作成し、メッセージにFrom、 To、 Subject設定します。

  • 実際のメッセージを次のように設定します。

    message.setText("your text goes here");
  • Transportオブジェクトを使用してメッセージを送信します。

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

ホストプロバイダーのJangoSMTPが提供するSMTPサーバーを使用しているため、ユーザー名とパスワードを認証する必要があります。javax.mail.PasswordAuthenticationのクラスは、パスワードを認証するために使用されます。

コンパイルして実行

クラスの準備ができたので、上記のクラスをコンパイルしましょう。SendEmail.javaクラスをディレクトリに保存しました:/home/manisha/JavaMailAPIExercise。クラスパスにjarjavax.mail.jaractivation.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....

JangoSMTPを介してGmailアドレスにメールを送信していると、Gmailアカウントの受信トレイに次のメールが届きます。

これは、マシンから添付ファイル付きの電子メールを送信する例です。ローカルマシン上のファイルはfile.txt/ home / manisha /に配置されます。ここでは、宛先の電子メールアドレスに電子メールを送信するためのJangoSMTPサーバーを使用しました。セットアップについては、「環境セットアップ」の章で説明しています。

インライン画像を含む電子メールを送信するには、次の手順に従います。

  • セッションを取得する

  • デフォルトのMimeMessageオブジェクトを作成し、メッセージにFrom、 To、 Subject設定します。

  • 実際のメッセージを次のように設定します。

    messageBodyPart.setText("This is message body");
  • MimeMultipartオブジェクトを作成します。実際のメッセージが設定された上記のmessageBodyPartを、このマルチパートオブジェクトに追加します。

  • 次に、次のようにDatahandlerを作成して、添付ファイルを追加します。

    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);
  • 次に、メッセージのマルチパートを次のように設定します。

    message.setContent(multipart);
  • Transportオブジェクトを使用してメッセージを送信します。

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

ホストプロバイダーのJangoSMTPが提供するSMTPサーバーを使用しているため、ユーザー名とパスワードを認証する必要があります。javax.mail.PasswordAuthenticationのクラスは、パスワードを認証するために使用されます。

コンパイルして実行

クラスの準備ができたので、上記のクラスをコンパイルしましょう。SendAttachmentInEmail.javaクラスをディレクトリに保存しました:/home/manisha/JavaMailAPIExercise。クラスパスにjarjavax.mail.jaractivation.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....

JangoSMTPを介してGmailアドレスにメールを送信していると、Gmailアカウントの受信トレイに次のメールが届きます。

これは、マシンからHTMLメールを送信する例です。ここでは、宛先の電子メールアドレスに電子メールを送信するためのJangoSMTPサーバーを使用しました。セットアップについては、「環境セットアップ」の章で説明しています。

この例は、単純な電子メールの送信と非常に似ていますが、ここではsetContent()メソッドを使用して、2番目の引数が「text / html」であるコンテンツを設定し、HTMLコンテンツがメッセージに含まれるように指定しています。この例を使用すると、好きなだけ大きなHTMLコンテンツを送信できます。

HTMLコンテンツを含む電子メールを送信するには、次の手順に従います。

  • セッションを取得する

  • デフォルトのMimeMessageオブジェクトを作成し、メッセージにFrom、 To、 Subject設定します。

  • 以下のようにsetContent()メソッドを使用して実際のメッセージを設定します。

    message.setContent("<h1>This is actual message embedded in 
       HTML tags</h1>", "text/html");
  • Transportオブジェクトを使用してメッセージを送信します。

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

ホストプロバイダーのJangoSMTPが提供するSMTPサーバーを使用しているため、ユーザー名とパスワードを認証する必要があります。javax.mail.PasswordAuthenticationのクラスは、パスワードを認証するために使用されます。

コンパイルして実行

クラスの準備ができたので、上記のクラスをコンパイルしましょう。SendHTMLEmail.javaクラスをディレクトリに保存しました:/home/manisha/JavaMailAPIExercise。クラスパスにjarjavax.mail.jaractivation.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....

JangoSMTPを介してGmailアドレスにメールを送信していると、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>");
  • 次に、メッセージのマルチパートを次のように設定します。

    message.setContent(multipart);
  • Transportオブジェクトを使用してメッセージを送信します。

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

ホストプロバイダーのJangoSMTPが提供するSMTPサーバーを使用しているため、ユーザー名とパスワードを認証する必要があります。javax.mail.PasswordAuthenticationのクラスは、パスワードを認証するために使用されます。

コンパイルして実行

クラスの準備ができたので、上記のクラスをコンパイルしましょう。SendInlineImagesInEmail.javaクラスをディレクトリに保存しました:/home/manisha/JavaMailAPIExercise。クラスパスにjarjavax.mail.jaractivation.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....

JangoSMTPを介してGmailアドレスにメールを送信していると、Gmailアカウントの受信トレイに次のメールが届きます。

この章に進む前に理解する必要のある2つの側面があります。彼らですCheck そして Fetch

  • CheckJavaMailで電子メールを送信することは、メールボックス内のそれぞれのフォルダーを開いて各メッセージを取得するプロセスです。ここでは、各メッセージのヘッダー、つまりFrom、To、subjectのみをチェックします。コンテンツは読み込まれません。

  • FetchJavaMailで電子メールを送信することは、メールボックス内のそれぞれのフォルダーを開いて各メッセージを取得するプロセスです。ヘッダーとともに、コンテンツタイプを認識することによってコンテンツも読み取ります。

JavaMail APIを使用してメールをチェックまたはフェッチするには、POPサーバーまたはIMAPサーバーが必要です。メールをチェックして取得するには、FolderクラスとStoreクラスが必要です。ここでは、GMAILのPOP3サーバー(pop.gmail.com)を使用しました。この章では、JavaMailAPIを使用してメールをチェックする方法を学習します。フェッチについては、後続の章で説明します。メールをチェックするには:

  • セッションを取得する

  • 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。クラスパスにjarjavax.mail.jaractivation.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ストアオブジェクトを作成し、ストアに接続します。

  • Folderオブジェクトを作成し、メールボックスで適切なフォルダーを開きます。

  • メッセージを取得します。

  • フォルダを閉じ、オブジェクトをそれぞれ保存します。

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。クラスパスにjarjavax.mail.jaractivation.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"

ここでは、メールボックスに3つのメールがあることがわかります。まず、「こんにちは、簡単なメッセージ文字列です...」というメッセージが記載された簡単なメールです。2番目のメールには添付ファイルがあります。添付ファイルの内容も上記のように印刷されます。3番目のメールにはインライン画像があります。

我々は、チャプターから私たちの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。クラスパスにjarjavax.mail.jaractivation.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

この章では、JavaMailAPIを使用して電子メールに返信する方法を説明します。以下のプログラムで実行される基本的な手順は次のとおりです。

  • プロパティにPOPおよびSMTPサーバーの詳細を含むSessionオブジェクトを取得します。メッセージを取得するにはPOPの詳細が必要であり、メッセージを送信するにはSMTPの詳細が必要です。

  • POP3ストアオブジェクトを作成し、ストアに接続します。

  • Folderオブジェクトを作成し、メールボックスで適切なフォルダーを開きます。

  • メッセージを取得します。

  • メッセージを繰り返して、返信する場合は「Y」または「y」と入力します。

  • メッセージのすべての情報(To、From、Subject、Content)を取得します。

  • Message.reply()メソッドを使用して、応答メッセージを作成します。このメソッドは、適切な受信者と件名で新しいメッセージを構成します。このメソッドは、送信者のみに返信するか(false)、すべてに返信するか(true)を示すブールパラメーターを取ります。

  • メッセージにFrom、Text、およびReply-toを設定し、Transportオブジェクトのインスタンスを介して送信します。

  • Transport、folder、storeオブジェクトをそれぞれ閉じます。

ここでは、宛先の電子メールアドレスに電子メールを送信するための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。クラスパスにjarjavax.mail.jaractivation.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 ....

メールの送信先の受信トレイを確認してください。この場合、受信したメッセージは次のようになります。

この章では、JavaMailAPIを使用してメールを転送する方法を説明します。以下のプログラムで実行される基本的な手順は次のとおりです。

  • プロパティにPOPおよびSMTPサーバーの詳細を含むSessionオブジェクトを取得します。メッセージを取得するにはPOPの詳細が必要であり、メッセージを送信するにはSMTPの詳細が必要です。

  • POP3ストアオブジェクトを作成し、ストアに接続します。

  • Folderオブジェクトを作成し、メールボックスで適切なフォルダーを開きます。

  • メッセージを取得します。

  • メッセージを繰り返し処理し、転送する場合は「Y」または「y」と入力します。

  • メッセージのすべての情報(To、From、Subject、Content)を取得します。

  • メッセージを構成する部分を操作して、転送メッセージを作成します。最初の部分はメッセージのテキストであり、2番目の部分は転送するメッセージです。2つを組み合わせてマルチパートにします。次に、マルチパートを適切にアドレス指定されたメッセージに追加して送信します。

  • Transport、folder、storeオブジェクトをそれぞれ閉じます。

ここでは、宛先の電子メールアドレスに電子メールを送信するための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。クラスパスにjarjavax.mail.jaractivation.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....

メールの送信先の受信トレイを確認してください。この場合、転送されるメッセージは次のようになります。

この章では、JavaMailAPIを使用してメールを削除する方法を説明します。メッセージの削除には、メッセージに関連付けられているフラグの操作が含まれます。状態ごとに異なるフラグがあり、システム定義のものとユーザー定義のものがあります。事前定義されたフラグは、内部クラスFlags.Flagで定義されており、以下にリストされています。

  • Flags.Flag.ANSWERED

  • Flags.Flag.DELETED

  • Flags.Flag.DRAFT

  • Flags.Flag.FLAGGED

  • Flags.Flag.RECENT

  • Flags.Flag.SEEN

  • Flags.Flag.USER

POPプロトコルは、メッセージの削除のみをサポートします。

削除プログラムの基本的な手順は次のとおりです。

  • プロパティにPOPおよびSMTPサーバーの詳細を含むSessionオブジェクトを取得します。メッセージを取得するにはPOPの詳細が必要であり、メッセージを送信するにはSMTPの詳細が必要です。

  • POP3ストアオブジェクトを作成し、ストアに接続します。

  • Folderオブジェクトを作成し、メールボックス内の適切なフォルダーをREAD_WRITEモードで開きます。

  • 受信トレイフォルダからメッセージを取得します。

  • メッセージオブジェクトでメソッドsetFlag(Flags.Flag.DELETED、true)を呼び出してメッセージを削除する場合は、メッセージを繰り返し処理し、「Y」または「y」と入力します。

  • DELETEDとマークされたメッセージは、Folderオブジェクトでexpunge()メソッドを呼び出すか、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。クラスパスにjarjavax.mail.jaractivation.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サーバーを使用してメールを送信しました。この章では、Gmailが提供するSMTPサーバーについて学習します。Gmail(とりわけ)は、パブリックSMTPサーバーの使用を無料で提供しています。

GmailSMTPサーバーの詳細はここにあります。詳細を見るとわかるように、TLSまたはSSL接続を使用して、GmailSMTPサーバー経由でメールを送信できます。

Gmail SMTPサーバーを使用してメールを送信する手順は、ホストサーバーを変更することを除いて、「メールの送信」の章で説明した手順と同様です。前提条件として、送信者のメールアドレスはアクティブな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。クラスパスにjarjavax.mail.jaractivation.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と呼び、他のシステムはそれを他の名前で呼ぶ場合があります。ただし、JavaMailAPIからINBOXという名前を使用していつでもアクセスできます。

JavaMail APIは、フォルダーを抽象Folderクラスのインスタンスとして表します。

public abstract class Folder extends Object

このクラスは、サーバーからの名前付きフォルダーの要求、フォルダーからのメッセージの削除、フォルダー内の特定のメッセージの検索、フォルダー内のメッセージの一覧表示などのメソッドを宣言します。

フォルダを開く

Folderクラスの唯一のコンストラクターが保護されているため、フォルダーを直接作成することはできません。次の場所からフォルダを取得できます。

  • セッション

  • 商店

  • または別のフォルダ

上記のすべてのクラスには、同様のシグネチャを持つ同様のgetFolder()メソッドがあります。

public abstract Folder getFolder(String name) throws MessagingException

Folderオブジェクトの取得に役立つメソッドのいくつかは次のとおりです。

方法 説明
ブール値exists() フォルダが実際に存在するかどうかを確認します。Folderオブジェクトを取得する前に、このメソッドを使用してください。
抽象ボイドオープン(intモード) フォルダを取得すると、そのフォルダは閉じられます。このメソッドを使用して開きます。モードは、Folder.READ_ONLYまたはFolder.READ_WRITEにすることができます。
抽象ブールisOpen() このメソッドは、フォルダーが開いている場合はtrueを返し、閉じている場合はfalseを返します。
抽象ボイドクローズ(ブール値の消去) フォルダを閉じます。expunge引数がtrueの場合、フォルダー内の削除されたメッセージはすべて、サーバー上の実際のファイルから削除されます。それ以外の場合は、単に削除済みとしてマークさますが、メッセージは削除を取り消すことができます。

基本的なフォルダ情報

以下は、フォルダーに関する基本情報を返すFolderクラスのメソッドの一部です。

方法 説明
抽象文字列getName() 「TutorialsPointMail」などのフォルダの名前を返します
抽象文字列getFullName() 「books / Manisha / TutorialsPointMail」などのルートから完全な階層名を返します。
URLName getURLName() このフォルダを表すURLNameを返します。
抽象フォルダgetParent() このフォルダを含むフォルダ、つまり親フォルダの名前を返します。たとえば、前の「TutorialsPointMail」の例の「Manisha」。
抽象intgetType() フォルダにメッセージやその他のフォルダを含めることができるかどうかを示すintを返します。
int getMode() 2つの名前付き定数Folder.READ_ONLYまたはFolder.READ_WRITEのいずれか、またはモードが不明な場合は-1を返します。
ストアgetStore() このフォルダが取得されたStoreオブジェクトを返します。
抽象文字getSeparator() このフォルダのパス名を直接のサブフォルダの名前から区切る区切り文字を返します。

フォルダの管理

以下は、フォルダの管理に役立ついくつかの方法です。

方法 説明
抽象ブール作成(int型) これにより、このフォルダのストアに新しいフォルダが作成されます。どこタイプは次のようになります。Folder.HOLDS_MESSAGESまたはFolder.HOLDS_FOLDERS。フォルダが正常に作成された場合はtrueを返し、そうでない場合はfalseを返します
抽象ブール削除(ブール再帰) これにより、フォルダが閉じられている場合にのみフォルダが削除されます。それ以外の場合は、IllegalStateExceptionをスローします。場合は再帰がある、その後、サブフォルダが削除されます。
抽象ブールrenameTo(フォルダf) これにより、このフォルダの名前が変更されます。名前を変更するには、フォルダを閉じる必要があります。それ以外の場合は、IllegalStateExceptionがスローされます。

フォルダ内のメッセージの管理

以下は、フォルダ内のメッセージの管理に役立ついくつかの方法です。

方法 説明
抽象voidappendMessages(Message []メッセージ) 名前が示すように、配列内のメッセージはこのフォルダーの最後に配置されます。
void copyMessages(Message []メッセージ、フォルダの宛先) これにより、このフォルダーから引数として指定された指定されたフォルダーにメッセージがコピーされます。
抽象メッセージ[]消去() フォルダからメッセージを削除するには、そのFlags.Flag.DELETEDフラグをtrueに設定します。削除されたメッセージをフォルダから物理的に削除するには、このメソッドを呼び出す必要があります。

フォルダの内容を一覧表示する

フォルダに含まれるフォルダを一覧表示するには、次の4つの方法があります。

方法 説明
Folder [] list() これにより、このフォルダーに含まれるフォルダーをリストする配列が返されます。
Folder [] listSubscribed() これにより、このフォルダーに含まれるすべてのサブスクライブされたフォルダーをリストする配列が返されます。
抽象フォルダ[]リスト(文字列パターン) これは、パターンを指定できることを除いて、list()メソッドに似ています。パターンは、一致するフォルダーの名前を示す文字列です。
Folder [] listSubscribed(文字列パターン) これは、パターンを指定できることを除いて、listSubscribed()メソッドに似ています。パターンは、一致するフォルダーの名前を示す文字列です。

メールの確認

方法 説明
抽象intgetMessageCount() このメソッドは、開いているフォルダーまたは閉じているフォルダーで呼び出すことができます。ただし、閉じたフォルダの場合、このメソッドは-1を返す場合と返さない場合があり、正確な数のメッセージを簡単に入手できないことを示します。
抽象ブールhasNewMessages() これは、フォルダが最後に開かれてから新しいメッセージがフォルダに追加された場合にtrueを返します
int getNewMessageCount() RECENTフラグが設定されているフォルダ内のメッセージをチェックすることにより、新しいメッセージ数を返します。
int getUnreadMessageCount() これは、開いているフォルダーまたは閉じているフォルダーのいずれかで呼び出すことができます。ただし、閉じたフォルダの場合は、実際の回答を取得するにはコストがかかりすぎることを示すために-1が返される場合があります。

フォルダからメッセージを取得する

Folderクラスは、開いているフォルダーからメッセージを取得するための4つのメソッドを提供します。

方法 説明
抽象メッセージgetMessage(int messageNumber) これにより、フォルダー内のn番目のメッセージが返されます。フォルダ内の最初のメッセージは番号1です。
メッセージ[] getMessages() これにより、このフォルダ内のすべてのメッセージを表すメッセージオブジェクトの配列が返されます。
Message [] getMessages(int start、int end) これにより、フォルダからメッセージオブジェクトの配列が返され、開始から終了までが含まれます。
Message [] getMessages(int [] messageNumbers) これにより、messageNumbers配列の番号で具体的に識別されたメッセージのみを含む配列が返されます。
void fetch(Message []メッセージ、FetchProfile fp) 指定されたメッセージのFetchProfileで指定されたアイテムをプリフェッチします。FetchProfile引数は、メッセージ内のどのヘッダーをプリフェッチするかを指定します。

フォルダの検索

サーバーが検索をサポートしている場合(多くのIMAPサーバーがサポートしており、ほとんどのPOPサーバーがサポートしていない場合)、特定の条件を満たすメッセージをフォルダーで簡単に検索できます。基準はSearchTermオブジェクトにエンコードされます。2つの検索方法は次のとおりです。

方法 説明
メッセージ[]検索(SearchTerm用語) 指定した検索条件に一致するメッセージをこのフォルダーで検索します。一致するメッセージを含む配列を返します。一致するものが見つからなかった場合は、空の配列を返します。
メッセージ[]検索(SearchTerm用語、メッセージ[]メッセージ) 指定されたメッセージの配列で、指定された検索条件に一致するメッセージを検索します。一致するメッセージを含む配列を返します。一致するものが見つからなかった場合は、空の配列を返します。指定されたメッセージオブジェクトは、このフォルダに属している必要があります。

フラグ

フラグの変更は、フォルダ内のメッセージセット全体のフラグを変更する必要がある場合に役立ちます。次に、Folderクラスで提供されるメソッドを示します。

方法 説明
void setFlags(Message []メッセージ、フラグフラグ、ブール値) 配列で指定されたメッセージに指定されたフラグを設定します。
void setFlags(int start、int end、Flagsフラグ、ブール値) 開始から終了までの番号が付けられたメッセージに、開始と終了の両方を含む指定されたフラグを設定します。
void setFlags(int [] messageNumbers、Flags flag、boolean value) メッセージ番号が配列にあるメッセージに指定されたフラグを設定します。
抽象フラグgetPermanentFlags() このフォルダがすべてのメッセージに対してサポートするフラグを返します。

JavaMailのクォータは、電子メールストア内のメッセージの数または量が制限されているか固定されています。各メールサービスリクエストは、JavaMailAPI呼び出しのクォータにカウントされます。電子メールサービスは、次の割り当て基準を適用できます。

  • 添付ファイルを含む送信メールメッセージの最大サイズ。

  • 添付ファイルを含む、受信メールメッセージの最大サイズ。

  • 管理者が受信者の場合のメッセージの最大サイズ

クォータ管理の場合、JavaMailには次のクラスがあります。

クラス 説明
パブリッククラスクォータ このクラスは、特定のクォータルートのクォータのセットを表します。各クォータルートには、Quota.Resourceクラスで表されるリソースのセットがあります。各リソースには、名前(たとえば、「STORAGE」)、現在の使用量、および使用制限があります。これには、メソッドsetResourceLimit(String name、long limit)が1つだけあります。
パブリック静的クラスQuota.Resource クォータルート内の個々のリソースを表します。
パブリックインターフェイスQuotaAwareStore クォータをサポートするストアによって実装されるインターフェース。getQuotaSETQUOTA方法は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();
      }
   }
}

IMAPStoreはQuotaAwareStoreを実装しているため、IMAP(imap.gmail.com)サーバーを介したGmailサービスへの接続は次のとおりです。Storeオブジェクトを取得したら、Quota配列をフェッチして繰り返し処理し、関連情報を出力します。

コンパイルして実行

クラスの準備ができたので、上記のクラスをコンパイルしましょう。QuotaExample.javaクラスをディレクトリに保存しました:/home/manisha/JavaMailAPIExercise。クラスパスにjarjavax.mail.jaractivation.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には、配信ステータス通知の解析のサポートが含まれています。この問題に対処するためのテクニックとヒューリスティックがいくつかあります。テクニックの1つは、可変エンベロープリターンパスです。次の例に示すように、エンベロープでリターンパスを設定できます。これは、バウンスメールが送信されるアドレスです。リモートバウンスを処理できるように、これをFrom:ヘッダーとは異なる汎用アドレスに設定することをお勧めします。これは、JavaMailでmail.smtp.fromプロパティを設定することによって行われます。

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.fromfromアドレスとは異なるように設定されていることがわかります。

コンパイルして実行

クラスの準備ができたので、上記のクラスをコンパイルしましょう。SendEmail.javaクラスをディレクトリに保存しました:/home/manisha/JavaMailAPIExercise。クラスパスにjarjavax.mail.jaractivation.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。これは、インターネットプロトコル(IP)ネットワークを介した電子メール(電子メール)送信のインターネット標準です。SMTPはTCPポート25を使用します。SSLで保護されたSMTP接続は、略称SMTPSで知られていますが、SMTPS自体はプロトコルではありません。

JavaMailAPIにはパッケージがあります com.sun.mail.smtpSMTPサーバーにアクセスするためのSMTPプロトコルプロバイダーとして機能します。次の表に、このパッケージに含まれるクラスを示します。

クラス 説明
SMTPMessage このクラスはMimeMessageクラスの特殊化であり、このメッセージがSMTPを介して送信されるときに使用されるさまざまなSMTPオプションとパラメーターを指定できます。
SMTPSSLTransport このクラスは、メッセージの送信と転送にSMTP overSSLを使用してTransport抽象クラスを実装します。
SMTPTransport このクラスは、メッセージの送信と転送にSMTPを使用してTransport抽象クラスを実装します。

次の表に、スローされる例外を示します。

例外 説明
SMTPAddressFailedException この例外は、メッセージを送信できない場合にスローされます。
SMTPAddressSucceededException mail.smtp.reportsuccessプロパティがtrueの場合、この例外はSendFailedExceptionから連鎖します。
SMTPSenderFailedException この例外は、メッセージを送信できない場合にスローされます。
SMTPSendFailedException この例外は、メッセージを送信できない場合にスローされます。例外には、メールサーバーが拒否した送信者のアドレスが含まれます。

ザ・ com.sun.mail.smtpプロバイダーはオプションでSMTP認証を使用します。SMTP認証を使用するには、mail.smtp.authプロパティを設定するか、SMTPサーバーに接続するときにSMTPトランスポートにユーザー名とパスワードを提供する必要があります。これは、次のいずれかのアプローチを使用して実行できます。

  • メールセッションを作成するときにAuthenticatorオブジェクトを提供し、Authenticatorコールバック中にユーザー名とパスワードの情報を提供します。mail.smtp.userプロパティは、コールバックのデフォルトのユーザー名を提供するように設定できますが、パスワードは明示的に指定する必要があります。このアプローチでは、静的なトランスポート送信メソッドを使用してメッセージを送信できます。例えば:

  • Transport.send(message);
  • ユーザー名とパスワードの引数を使用して、Transportconnectメソッドを明示的に呼び出します。例えば:

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

SMTPプロトコルプロバイダーは、JavaMailSessionオブジェクトで設定できる次のプロパティをサポートしています。プロパティは常に文字列として設定されます。例えば:

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

IMAPはの頭字語です Internet Message Access Protocol。これは、電子メールクライアントがリモートメールサーバー上の電子メールにアクセスできるようにするアプリケーション層インターネットプロトコルです。IMAPサーバーは通常、既知のポート143でリッスンします。IMAPoverSSL(IMAPS)はポート番号993に割り当てられます。

IMAPは、オンラインとオフラインの両方の操作モードをサポートします。IMAPを使用する電子メールクライアントは、通常、ユーザーが明示的にメッセージを削除するまで、サーバーにメッセージを残します。

パッケージ com.sun.mail.imapは、IMAPメッセージストアへのアクセスを提供するJavaMailAPIのIMAPプロトコルプロバイダーです。次の表に、このプロバイダーのインターフェイスとクラスを示します。

クラス/インターフェース 説明
IMAPFolder.ProtocolCommand これは、ユーザー定義のIMAPプロトコルコマンド用のシンプルなインターフェイスです。
ACL これはクラスです。特定の認証識別子(ユーザーまたはグループ)のアクセス制御リストエントリ。
IMAPFolder このクラスは、IMAPフォルダーを実装します。
IMAPFolder.FetchProfileItem これは、ヘッダーをフェッチするためのクラスです。
IMAPMessage このクラスは、ReadableMimeオブジェクトを実装します。
IMAPMessage.FetchProfileCondition このクラスは、フォルダー内の各メッセージに対して実行されるテストを実装します。
IMAPSSLStore このクラスは、SSLを介したIMAPメッセージストアへのアクセスを提供します。
IMAPStore このクラスは、IMAPメッセージストアへのアクセスを提供します。
権利 このクラスは、認証識別子(たとえば、ユーザーまたはグループ)の一連の権限を表します。
Rights.Right この内部クラスは、個人の権利を表します。
SortTerm RFC5256で定義されている特定のソート基準。

このプロバイダーの上で注意すべきいくつかのポイント:

  • このプロバイダーは、IMAP4プロトコルとIMAP4rev1プロトコルの両方をサポートします。

  • 接続されたIMAPStoreは、IMAPサーバーとの通信に使用するIMAPプロトコルオブジェクトのプールを維持します。フォルダが開かれ、新しいIMAPプロトコルオブジェクトが必要になると、IMAPStoreは接続プールからそれらを提供するか、使用可能なものがない場合はそれらを作成します。フォルダが閉じられると、プールの場合、そのIMAPプロトコルオブジェクトが接続プールに返されます。

  • 接続されたIMAPStoreオブジェクトは、ストアにIMAPサーバーへの専用接続を提供する個別のIMAPプロトコルオブジェクトを維持する場合と維持しない場合があります。

ポストオフィスプロトコル(POP)は、ローカル電子メールクライアントがTCP / IP接続を介してリモートサーバーから電子メールを取得するために使用するアプリケーション層のインターネット標準プロトコルです。POPは、リモートメールボックスにアクセスするための単純なダウンロードと削除の要件をサポートしています。POP3サーバーは既知のポート110でリッスンします。

パッケージ com.sun.mail.pop3は、POP3メッセージストアへのアクセスを提供するJavaMailAPIのPOP3プロトコルプロバイダーです。次の表に、このパッケージのクラスを示します。

名前 説明
POP3Folder POP3フォルダ(「INBOX」のみ)。
POP3Message POP3メッセージ。
POP3SSLStore SSLを使用したPOP3メッセージストア。
POP3Store POP3メッセージストア。

このプロバイダーの上で注意すべきいくつかのポイント:

  • POP3プロバイダーは、という名前の単一のフォルダーのみをサポートします INBOX。POP3プロトコルの制限により、イベント通知、フォルダー管理、フラグ管理などのJavaMailAPI機能の多くは許可されていません。

  • POP3プロバイダーには、プロトコル名pop3またはpop3:// user:password @ host:port / INBOX "の形式のURLを使用してJavaMailAPIを介してアクセスします

  • 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の方法は、フォルダを閉じずにキャッシュされたデータを無効化するために使用することができます。