←TopPage>eclipseで開発>J2EEしてみんとす>J2EEでJavaMail


J2EEでJavaMail

はじめに

Lomboz-MLで「JavaMailのactivation.jarがロードできないエラー」というのが出ていたので、ちょろっとJavaMailしてみました。

参照: Lomboz-ML http://www.egroups.co.jp/group/Lomboz

Servletの作成準備

まずは、J2EE Projectを準備します。

プロジェクト名JavaMailProject
Webモジュール名JavaMailWeb
サーバJ2EE RI 1.3.1

参照: ../J2EEプロジェクト作成

注意:  J2EE RI 1.3.1を利用するために、<eclipse.home>/plugins/com.objectlearn.jdt.j2ee/servers にRI.serverを置くことを忘れていないことを確認してください。

Servlet Wizardで、Servletを作成します。

パッケージ名test
クラス名JavaMailServlet

参考: ../WAR作成

メイルを送信コードを作成

サーブレットにwebdocletを埋め込む

サーブレットプログラムを修正します。

まず、JavaMailのセッションリリースを利用するためにJavaMailServletのクラスJavadocに以下のwebdocletへの命令を追加します。

* @web:servlet name="JavaMailServlet"
*      display-name="JavaMail TEST Servlet"
*      load-on-startup="1"
* @web:servlet-mapping url-pattern="/JavaMailTest/*"
* @web:resource-ref
*      name="TheMailSession" 
*      type="javax.mail.Session" auth="Application"

サーブレットのメール送信コード作成

メール送信処理は「J2EEチュートリアル」を参考にして作ります。 「リソース接続」→「メールセッション接続」にあるConfirmerEJB例題アプリケーションのsendNotice(String recipient)メソッドをコピーして使います。

参照: J2EEチュートリアル

ここで注目すべきは、Mailセッションの取得方法です。

JavaMailをJ2EEコンテナが無いtomcat上や、JavaMailを単独で利用するときのように、

Properties props = new Properties();
props.put("mail.smtp.host","mail");
Session session = Session.getDefaultInstance(props,null);

とはせず、以下のようにInitialContextよりJNDIにより取得することです。

Context initial = new InitialContext();
Session session =
   (Session) initial.lookup("java:comp/env/TheMailSession");

このようにすることにより、Beanのプログラム時ではなく、アセンブル時に環境に合わせたmailserverを設定することが出来ます。

この作業分担が、Beanのコンポーネント化には、非常に役立ち、J2EEコンテナを利用する醍醐味でもあります。

サーブレットメイン処理作成

サーブレットが呼び出されたときに画面を作成しながらメイルを送信するメソッドを追加します。

public void service(HttpServletRequest request, 
		    	HttpServletResponse response) 
  throws ServletException, IOException {
  // ContentTypeを設定
  response.setContentType("text/html; charset=euc-jp");
  // 出力用PrintWriterを取得
  PrintWriter out = response.getWriter();
  // 出力
  out.println("<html>");
  out.println("<head>");
  out.println("<title>Hello World Servlet</title>");
  out.println("</head>"); 
  out.println("<body>");
  out.println("Hello World<BR>"); 

   sendNotice("-SendMailAddress-"); 
            ↑ここは送信先のメイルアドレスにする。

  out.println("Sent mail."); 
  out.println("</body>");
  out.println("</html>");
}

ここで使われるstatic変数も定義します。

private static final String mailer = "JavaMailer";

完成したソース JavaMailServlet.java を、このページに添付します。

WARを作ります

Servletクラスを保存して、deployを行います。パッケージ・エクスプローラのJavaMailWeb」で右クリックして「Lomboz J2EE...」→「deploy」とするとJavaMailWebの直下にJavaMailWeb.warが作成されます。

注意: Lombozに内蔵されているXDocletのWARを作成する。webdocletを利用できるように、build.xmlを置き換えてbuild.propertiesにパラメータを追加してからdeployを行います。 deployと命令していますが、上で設定したRI.serverではWARの作成までて、実際のJ2EE RIへのdeployは行わません。

参考: ../WAR作成

J2EE RI 1.3.1でdeployする

J2EE起動してdeploytoolを立ち上げる

% j2ee -verbose

別のコンソール(kterm)で

% deploytool

J2EEアプリケーションの作成

EARファイルを作る

deployNewApp.png

[ファイル]→[新規]→[アプリケーション]

新規アプリケーションのダイアログで、EARファイルの置き場所を決めます。 「<eclipse.workspace>/JavaMailProject/JavaMailProject.ear」 を指定して[新規アプリケーションの作成]をPush

アプリケーションの表示名はdefaultの「JavaMailProject」ままにしておきます。

deployAddWar.png

作成したアプリケーションを選択して「ファイル」→「アプリケーションに追加」→「Web WAR(B)...」で作成した<eclipse.workspace>/JavaMailProject/JavaMailWeb/JavaMailWeb.warを登録(Web WARを追加)します。

アプリケーションの設定

deployContext.png

まずは、コンテキストルートを設定します。「TEST」と入力します。

deployJNDI.png

次にJNDIを設定します。JavaMailProjectの「JNDI名」タグの「JNDI名」が空白なので、「MyMailer」と入力。(以下の「TheMailSession」の設定を行えば同時に設定されるから、この作業はいらないかも…)

メイル・セッションの設定を行います。「Generate by XDoclet」と名前のついたWebコンポーネントを選択し、「リソース参照」タグの中にある「コード名」の「TheMailSession」を選択すると、画面下の「配備値の設定: TheMailSession」が入力できる。

deployMailSession.png

ここで、

JNDI名MyMailer
送信元root@yourserver.comメールアドレス
ホストlocalhostメールサーバ
ユーザ名You Namailリアルネーム

を入力する。

ここでのアセンブル時に、はじめてメールサーバを指定することになります。 これがJ2EEコンテナを利用する時に初めて出会う 、コンポーネントであるBeanを開発するBeanプロバイダーと、環境に合わせてコンポーネントを組み合わせてシステムを組み上げるアセンプラーの作業分担となります。

アプリケーションのバリデーション

J2EEの配備(deploy)の前にアプリケーションの整合性を調べます。

JavaMailProjectアプリケーションを選択して、「ツール(T)」→「ベリファイ」としてベリファイを行う。テスト全部を表示する必要は無いので、ラジオボタン「失敗のみ」にして「了解」として、テストを行います。

deployVerify.png

TabLibのロケーションが違うと出ているのはご愛嬌なので、とりあえず無視

アプリケーションの配備(deploy)

JavaMailProjectアプリケーションを選択して「ツール(T)」→「配備」

deployDeploy1.png

defaultのまま「完了」すると、配備は、順調に終わるはずです。

動作確認

さて、動作確認です。ブラウザーで

http://localhost:8000/TEST/JavaMailTest/

をアクセスします。ブラウザーに

Hello World
Sent mail. 

と表示されて、メイルが送信されるはずです。

注意: サンプルソースで、送信先アドレスを直していないと、以下のようなエラーが出ます

javax.servlet.ServletException: Sending failed;
nested exception is: 
 javax.mail.SendFailedException: Invalid Addresses;
nested exception is: 
 javax.mail.SendFailedException:
  550 5.1.1 <-SendMailAddress->... User unknown

最後に

サンプルとしてeclipse + Lomboz 2.1のJ2EEプロジェクト一式をJavaMailProjectSample.zip として、このページに添付しました。

このプロジェクトの中には、コンパイル済みのバイナリ、WARファイル、WARファイル(JavaMailWeb.war)を取り込んで作成したして、J2EE RI 1.3.1で、すぐに使えるEARファイル(JavaMailProject.ear)が含まれています。

ただし、メイルの送信先が-SendMailAddress-のままなので、そのままでは正常には動きません。(メイル送信されません)


←もくじに戻る

コメントをどうぞ…

コメント例: J2EEコンテナでは、MailセッションをJNDIで取得することをご存じでしたか?

コメントはありません。 Comments/eclipseで開発/J2EE/J2EEでJavaMail

お名前:

←TopPage>eclipseで開発>J2EEしてみんとす>J2EEでJavaMail


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS