←TopPage>eclipseで開発>J2EEしてみんとす>J2EEでJavaMail
Lomboz-MLで「JavaMailのactivation.jarがロードできないエラー」というのが出ていたので、ちょろっとJavaMailしてみました。
参照: Lomboz-ML http://www.egroups.co.jp/group/Lomboz
まずは、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作成
サーブレットプログラムを修正します。
まず、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 を、このページに添付します。
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 -verbose
別のコンソール(kterm)で
% deploytool
[ファイル]→[新規]→[アプリケーション]
新規アプリケーションのダイアログで、EARファイルの置き場所を決めます。 「<eclipse.workspace>/JavaMailProject/JavaMailProject.ear」 を指定して[新規アプリケーションの作成]をPush
アプリケーションの表示名はdefaultの「JavaMailProject」ままにしておきます。
作成したアプリケーションを選択して「ファイル」→「アプリケーションに追加」→「Web WAR(B)...」で作成した<eclipse.workspace>/JavaMailProject/JavaMailWeb/JavaMailWeb.warを登録(Web WARを追加)します。
まずは、コンテキストルートを設定します。「TEST」と入力します。
次にJNDIを設定します。JavaMailProjectの「JNDI名」タグの「JNDI名」が空白なので、「MyMailer」と入力。(以下の「TheMailSession」の設定を行えば同時に設定されるから、この作業はいらないかも…)
メイル・セッションの設定を行います。「Generate by oclet」と名前のついたWebコンポーネントを選択し、「リソース参照」タグの中にある「コード名」の「TheMailSession」を選択すると、画面下の「配備値の設定: TheMailSession」が入力できる。
ここで、
JNDI名 | MyMailer | |
送信元 | root@yourserver.com | メールアドレス |
ホスト | localhost | メールサーバ |
ユーザ名 | You Namail | リアルネーム |
を入力する。
ここでのアセンブル時に、はじめてメールサーバを指定することになります。 これがJ2EEコンテナを利用する時に初めて出会う 、コンポーネントであるBeanを開発するBeanプロバイダーと、環境に合わせてコンポーネントを組み合わせてシステムを組み上げるアセンプラーの作業分担となります。
J2EEの配備(deploy)の前にアプリケーションの整合性を調べます。
JavaMailProjectアプリケーションを選択して、「ツール(T)」→「ベリファイ」としてベリファイを行う。テスト全部を表示する必要は無いので、ラジオボタン「失敗のみ」にして「了解」として、テストを行います。
TabLibのロケーションが違うと出ているのはご愛嬌なので、とりあえず無視
JavaMailProjectアプリケーションを選択して「ツール(T)」→「配備」
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