16 WebLogic ServerでのJakarta Mailのプログラミング

WebLogic ServerでJakarta MailをプログラミングしてWebLogic Serverアプリケーションに電子メール機能を追加する方法を学習します。

この章の内容は次のとおりです。

WebLogic ServerアプリケーションでのJakarta Mailの使用の概要

WebLogic Serverには、Jakarta Mail APIバージョン1.5のリファレンス実装が含まれています。Jakarta Mail APIを使用すると、WebLogic Serverアプリケーションに電子メール機能を追加できます。Jakarta Mailを使用すると、自社ネットワークまたはインターネット上のIMAP (Internet Message Access Protocol)対応およびSMTP (Simple Mail Transfer Protocol)対応のメール・サーバーにJavaアプリケーションからアクセスできます。メール・サーバー機能は提供されないため、Jakarta Mailを使用するには、メール・サーバーにアクセスできる必要があります。

Jakarta Mail APIの使用に関するドキュメントは、https://jakarta.ee/specifications/mail/1.6/で入手できます。この項では、WebLogic Server環境でJakarta Mailを使用する方法について説明しています。

weblogic.jarファイルには、次のJakarta Mail APIパッケージが含まれています:

  • javax.mail

  • javax.mail.event

  • javax.mail.internet

  • javax.mail.search

weblogic.jarファイルには、Jakarta Mailで必要なJAF (Java Activation Framework)パッケージも含まれています。

javax.mailパッケージには、Internet Message Access Protocol (IMAP)およびSimple Mail Transfer Protocol (SMTP)メール・サーバーのプロバイダが含まれています。Jakarta Mail用に独自のPOP3プロバイダがあります。これは、weblogic.jarには含まれていません。POP3プロバイダは、使用する場合、https://maven.java.net/content/repositories/releases/com/sun/mail/pop3からダウンロードし、それをWebLogic Serverクラスパスに追加できます。

Jakarta Mail構成ファイルの理解

Jakarta Mailは、システムのメール・トランスポート機能を定義する構成ファイルに依存します。weblogic.jarファイルには、IMAPおよびSMTPメール・サーバーをJakarta Mailに対して有効にし、Jakarta Mailが処理できるデフォルトのメッセージ・タイプを定義する標準構成ファイルが含まれています。

Jakarta Mailを拡張して追加のトランスポート、プロトコル、およびメッセージタイプをサポートする場合を除き、Jakarta Mail構成ファイルを変更する必要はありません。Jakarta Mailを拡張する場合は、https://javaee.github.io/javamail/ThirdPartyProductsを参照してください。次に、拡張したJakarta MailパッケージをWebLogic Serverクラスパスのweblogic.jarに追加します。

WebLogic Server用のJakarta Mailの構成

WebLogic Serverで使用するためにJakarta Mailを構成するには、WebLogicリモート・コンソールでメール・セッションを作成します。これにより、あらかじめ構成しておくセッション・プロパティを使用して、サーバー側モジュールとアプリケーションでJNDIを用いてJakarta Mailサービスにアクセスできるようになります。

たとえば、メール・セッションを作成すると、メール・ホスト、トランスポートおよび格納プロトコル、デフォルトのメール・ユーザーをWebLogicリモート・コンソールで指定できるため、Jakarta Mailを使用するモジュールでこれらのプロパティを設定する必要はありません。メール・セッションは単一のjavax.mail.Sessionオブジェクトを作成し、JNDIを通じてそのオブジェクトを必要とするすべてのモジュールで利用できるようにするため、多数の電子メール・ユーザーを持つアプリケーションではメリットが得られます。

WebLogicリモート・コンソールを使用してメール・セッションを作成するには、Oracle WebLogicリモート・コンソール・オンライン・ヘルプJavaMailへのアクセスの構成に関する項を参照してください。

メール・セッションで設定したプロパティ・セットは、オーバーライドするプロパティを含むjava.util.Propertiesオブジェクトを作成すると、コード内でオーバーライドできます。「Jakarta Mailを使用したメッセージの送信」を参照してください。メール・セッション・オブジェクトをJNDIでルックアップした後、Propertiesオブジェクトを使用してSession.getInstance()メソッドを呼び出し、カスタマイズしたセッションを取得します。

Jakarta Mailを使用したメッセージの送信

WebLogic Serverモジュール内のJakarta Mailを使用してメッセージを送信できます。

Jakarta Mailを使用したメッセージの送信ステップは次のとおりです:

  1. JNDI(ネーミング)、JavaBean Activation、Jakarta Mailパッケージをインポートします。java.util.Properties:もインポートします。
    import java.util.*;
    import javax.activation.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.naming.*;
    
  2. JNDIでメール・セッションを次のようにルックアップします。
    InitialContext ic = new InitialContext();
    Session session = (Session) ic.lookup("myMailSession");
    
  3. WebLogicリモート・コンソールで設定したセッションのプロパティをオーバーライドする必要がある場合は、java.util.Propertiesオブジェクトを作成してオーバーライドするプロパティを追加します。getInstance()を呼び出して、新しいプロパティの新しいセッション・オブジェクトを取得します。
    Properties props = new Properties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.host", "mailhost");
    // use mail address from HTML form for from address
    props.put("mail.from", emailAddress);
    Session session2 = session.getInstance(props);
    
  4. MimeMessageを作成します。次の例で、tosubject、およびmessageTxtは文字列の変数で、ユーザーが入力した内容が入ります。
    Message msg = new MimeMessage(session2);
    msg.setFrom();
    msg.setRecipients(Message.RecipientType.TO, 
                      InternetAddress.parse(to, false));
    msg.setSubject(subject);
    msg.setSentDate(new Date());
    // Content is stored in a MIME multi-part message
    // with one body part
    MimeBodyPart mbp = new MimeBodyPart();
    mbp.setText(messageTxt);
    Multipart mp = new MimeMultipart();
    mp.addBodyPart(mbp);
    msg.setContent(mp);
    
  5. メッセージを送信します。
    Transport.send(msg);
    

JNDIルックアップでは、障害が発生するとNamingException例外がスローされます。Jakarta Mailでは、トランスポート・クラスの特定に問題がある場合、またはメール・ホストとの通信に失敗した場合にMessagingExceptionがスローされることがあります。コードをtryブロックの中に配置し、これらの例外を捕捉するようにしておきます。

Jakarta Mailを使用したメッセージの読取り

Jakarta Mail APIでは、指定した数または範囲のメッセージを読み取る、またはメッセージの特定の部分をあらかじめ取り出してフォルダのキャッシュに入れるなど、メッセージの読取りについて複数のオプションを提供しています。

Jakarta Mail APIを使用すると、メッセージ・ストアに接続できます。メッセージ・ストアはIMAPサーバーまたはPOP3サーバーとなります。メッセージはフォルダに保存されます。IMAPの場合、メッセージ・フォルダはメール・サーバー上に格納されます。メッセージ・フォルダには、受信したメッセージが入るフォルダとアーカイブされたメッセージが入るフォルダがあります。POP3の場合は、メッセージの到着時にメッセージを保存するフォルダをサーバーが提供します。クライアントは、POP3サーバーに接続するときに、メッセージを取得してクライアントのメッセージ・ストアに転送します。

フォルダは、ディスクのディレクトリと同じような階層構造になっています。フォルダにはメッセージまたは他のフォルダを格納できます。デフォルトのフォルダは構造の最上位にあります。特別なフォルダ名であるINBOXは、ユーザーのプライマリ・フォルダのことを指し、デフォルト・フォルダの内部にあります。受信したメールを読み込むには、ストアからデフォルト・フォルダを取得して、次にデフォルト・フォルダからINBOXフォルダを取得します。

APIには、メッセージの読込みに関するオプションがいくつか用意されています。詳細は、Jakarta Mail APIを参照してください。

WebLogic Serverモジュール内からPOP3サーバーで受信したメッセージを読み込むステップは次のとおりです。

  1. JNDI(ネーミング)、JavaBean Activation、Jakarta Mailパッケージをインポートします。java.util.Properties:もインポートします。
    import java.util.*;
    import javax.activation.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    import javax.naming.*;
    
  2. JNDIでメール・セッションを次のようにルックアップします。
    InitialContext ic = new InitialContext();
    Session session = (Session) ic.lookup("myMailSession");
    
  3. WebLogicリモート・コンソールで設定したセッションのプロパティをオーバーライドする必要がある場合は、Propertiesオブジェクトを作成してオーバーライドするプロパティを追加します。getInstance()を呼び出して、新しいプロパティの新しいセッション・オブジェクトを取得します。
    Properties props = new Properties();
    props.put("mail.store.protocol", "pop3");
    props.put("mail.pop3.host", "mailhost");
    Session session2 = session.getInstance(props);
    
  4. セッションからStoreオブジェクトを取得し、connect()メソッドを呼び出してメール・サーバーに接続します。接続の認証を行うには、接続メソッドでメール・ホスト、ユーザー名、およびパスワードを提供する必要があります。
    Store store = session.getStore();
    store.connect(mailhost, username, password);
    
  5. デフォルト・フォルダを取得し、そのフォルダを使用してINBOXフォルダを取得します。
    Folder folder = store.getDefaultFolder();
    folder = folder.getFolder("INBOX");
    
  6. フォルダ内のメッセージを、メッセージの配列に読み込みます。
    Message[] messages = folder.getMessages();
    
  7. メッセージの配列にあるメッセージを処理します。メッセージ・クラスには、ヘッダー、フラグ、メッセージの内容など、メッセージの様々な部分にアクセスできるメソッドがあります。

IMAPサーバーからのメッセージの読込みは、POP3サーバーからのメッセージの読込みと同様です。ただしIMAPの場合は、フォルダを作成および操作し、フォルダ間でメッセージを転送するメソッドがJakarta Mail APIで提供されています。IMAPサーバーを使用すると、POP3サーバーを使用する場合よりも少ないコードで、多機能なWebベースのメール・クライアントを実装できます。POP3では、おそらくデータベースまたはフォルダを表すためのファイル・システムを使用して、WebLogic Serverからメッセージ・ストアを管理するコードを記述する必要があります。