←TopPage>[[eclipseで開発]]>[[J2EEしてみんとす>eclipseで開発/J2EE]]>J2EEでJavaMail
#navi([[eclipseで開発/J2EE]])

*J2EEでJavaMail
#contents
**はじめに

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チュートリアル:http://jdc.sun.co.jp/j2ee/tutorial/]]

''ここで注目すべきは、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ファイルを作る
#ref(deployNewApp.png)
[ファイル]→[新規]→[アプリケーション]

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

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

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

**アプリケーションの設定
#ref(deployContext.png)
まずは、コンテキストルートを設定します。「TEST」と入力します。

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

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

#ref(deployMailSession.png)
ここで、
|JNDI名|MyMailer||
|送信元|root@yourserver.com|メールアドレス|
|ホスト|localhost|メールサーバ|
|ユーザ名|You Namail|リアルネーム|
を入力する。

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

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

JavaMailProjectアプリケーションを選択して、「ツール(T)」→「ベリファイ」としてベリファイを行う。テスト全部を表示する必要は無いので、ラジオボタン「失敗のみ」にして「了解」として、テストを行います。
#ref(deployVerify.png)
SIZE(1):TabLibのロケーションが違うと出ているのはご愛嬌なので、とりあえず無視

**アプリケーションの配備(deploy)
JavaMailProjectアプリケーションを選択して「ツール(T)」→「配備」
#ref(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-のままなので、そのままでは正常には動きません。(メイル送信されません)

----
[[←もくじに戻る>../#index]]

**CENTER:コメントをどうぞ…
コメント例: J2EEコンテナでは、MailセッションをJNDIで取得することをご存じでしたか?
#pcomment(,10,reply)

#navi([[eclipseで開発/J2EE]])
←TopPage>[[eclipseで開発]]>[[J2EEしてみんとす>eclipseで開発/J2EE]]>J2EEでJavaMail


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