- PR -

StrutsのActionでメール送信機能が実装出来ない

投稿者投稿内容
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2004-03-01 12:07
Red Hat Linux9
JBoss3.2.3
Struts1.1
でWebアプリケーションを作成しています。
Actionでメール送信機能を実装しようとするとエラーが発生します。

以下がソース(MailAction.java)です。

-----------------------
package test;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
public class MailAction extends Action
{
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
{
try {
MailForm f = (MailForm)form;
Properties props = new Properties();
props.put("mail.smtp.host", "localhost");
javax.mail.Session msession = javax.mail.Session.getDefaultInstance(props, null);
MimeMessage msg = new MimeMessage(msession);
msg.setFrom(new InternetAddress("test@test.co.jp", "テストユーザ", "iso-2022-jp"));
msg.setRecipients(Message.RecipientType.TO, f.getTo());
msg.setSubject("テスト件名","iso-2022-jp");
msg.setText("本文", "iso-2022-jp");
msg.setHeader("Content-Type","text/plain");
msg.setSentDate(new java.util.Date());
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace();
}
// 結果のページを返す
return mapping.findForward("success");
}
}
-----------------------

デバッグプリントを入れてみると、
MimeMessage msg = new MimeMessage(msession);
ここでエラーが発生しているようです。

実装方法は、struts-blank.warを解凍して、メール送信用ページmail.jsp

-----------------------
<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<HTML><body>
<html:form action="/Mail">
<html:text name="MailForm" property="to"/>
<html:submit value="送信" />
</html:form>
</body></HTML>
-----------------------

と、結果表示のsuccess.jsp

-----------------------
<%@ page contentType="text/html; charset=Shift_JIS" %>
<HTML><body>
mail success!!<BR/>
メール送信成功!!
</body></HTML>
-----------------------

を追加し、上記のActionと、フォームのMailForm.java

-----------------------
package test;
import org.apache.struts.action.ActionForm;
public class MailForm extends ActionForm
{
private String to;
public void setTo(String val){
to = val;
}
public String getTo(){
return to;
}
}
-----------------------

を追加し、struts-config.xmlのform-beansとaction-mappingsに


-----------------------
<form-bean name="MailForm" type="test.MailForm"/>
-----------------------

-----------------------
<action path="/Mail" type="test.MailAction" name="MailForm" scope="request" validate="false">
<forward name="success" path="/pages/success.jsp"/>
</action>
-----------------------

を追加しましただけです。

発生するエラーは、以下のようになっております。

-----------------------
11:43:54,931 INFO [TilesRequestProcessor] Tiles definition factory found for re
quest processor ''.
11:43:55,036 ERROR [Engine] StandardWrapperValve[action]: サーブレット action の
Servlet.service()が例外を投げました
javax.servlet.ServletException: サーブレットの実行により例外を投げました
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:643)
at org.jboss.web.tomcat.security.JBossSecurityMgrRealm.invoke(JBossSecur
ityMgrRealm.java:220)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve
.java:246)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.jboss.web.tomcat.tc4.statistics.ContainerStatsValve.invoke(Contai
nerStatsValve.java:76)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:
2417)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatche
rValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit
yAssociationValve.java:65)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:
577)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:19
7)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:781)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
ssConnection(Http11Protocol.java:549)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java
:605)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP
ool.java:677)
at java.lang.Thread.run(Thread.java:534)
11:43:55,046 ERROR [Engine] ----- Root Cause -----
java.lang.NoClassDefFoundError: javax/activation/DataSource
at test.MailAction.execute(Unknown Source)
at org.apache.struts.action.RequestProcessor.processActionPerform(Reques
tProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.ja
va:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:148
2)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:256)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:191)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:643)
at org.jboss.web.tomcat.security.JBossSecurityMgrRealm.invoke(JBossSecur
ityMgrRealm.java:220)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve
.java:246)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.jboss.web.tomcat.tc4.statistics.ContainerStatsValve.invoke(Contai
nerStatsValve.java:76)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:
2417)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:180)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatche
rValve.java:171)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:172)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit
yAssociationValve.java:65)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:
577)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:641)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:174)
at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContex
t.invokeNext(StandardPipeline.java:643)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:480)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995)
at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:19
7)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:781)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
ssConnection(Http11Protocol.java:549)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java
:605)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP
ool.java:677)
at java.lang.Thread.run(Thread.java:534)
-----------------------

単純にメール送信機能を実現したいだけなのですが、Strutsとなにか競合してしまって
この現象が起こっているのでしょうか?原因は何でしょうか?
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-03-01 12:11
引用:

kojiさんの書き込み (2004-03-01 12:07) より:
11:43:55,046 ERROR [Engine] ----- Root Cause -----
java.lang.NoClassDefFoundError: javax/activation/DataSource



必要なライブラリがない。もしくは CLASSPATH を通していない。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-03-01 12:27
JavaMailにはJAF(JavaBeans Activation Framework)と言うライブラリが別途必要です。
JavaMailのjarと同じところにJAFのjarも置いたらうまくいきませんか?
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2004-03-01 13:02
ふーばーさん、おばけさん、ありがとうございます。

JAF(activation.jar)はmail.jarと同じ場所においてあります。
さらに、環境変数CLASSPATHにもactivation.jarを設定しています。
envで見るとCLASSPATHは以下のようになっています。(一番最後に設定しています)

CLASSPATH=:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/axi
s.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/axis-ant
.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/commons-d
iscovery.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/c
ommons-logging.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF
/lib/jaxrpc.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/li
b/log4j-1.2.8.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/
lib/saaj.jar:/usr/share/jboss-3.2.3/server/default/deploy/axis.war/WEB-INF/lib/w
sdl4j.jar:/usr/share/jboss-3.2.3/server/default/lib/activation.jar

mail.jarはとくに設定していませんが問題無いようなので、activation.jarをmail.jar
と同じ場所においておけば大丈夫だと思っていました。で、念のため、CLASSPATHにも設定
しています。

しかし、エラーの最初の方ばかり見て、
java.lang.NoClassDefFoundError: javax/activation/DataSource
をあまり重視していませんでした。これはまさにJBossがこれを認識できてないって
事ですよね。設定をさぐってみます。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-03-01 13:37
引用:

JAF(activation.jar)はmail.jarと同じ場所においてあります。


なるほど。
ということは、CLASSPATHには設定しているがJBOSS上でクラスをロードできて
いないという可能性もありますね。
この場合、私が良くやる手ですが、テスト用のJSPを作成してクラスローダの持ってる
クラスパスを表示させる、というやり方が有効です。具体的には、
java.lang.System#getPropertiesでシステムプロパティを全部引きずり出して表示
させればOKです(HTMLテーブルを使って整形すれば見やすくて良いでしょう)。
koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2004-03-01 14:53
おばけさん、ありがとうございます。この方法は今後もすごく使えますね。

教えていただいたとおり、以下のようなjspを作成してクラスパスを見てみましたが
どうもactivation.jarが参照できない状態のようでした。

---------------------------
<%@ page contentType="text/html; charset=Shift_JIS" import="java.util.*"%>
<html><body><table>
<%
Properties properties = System.getProperties();
Enumeration keys = properties.keys();
while (keys.hasMoreElements()) {
out.print("<tr>");
String key = (String)keys.nextElement();
String value = (String)properties.get(key);
out.print("<td>" + key + "</td><td>" + value + "</td>");
out.print("</tr>");
}
%>
</table></body></html>
---------------------------

ですので、jreが参照できるところにライブラリを置きました。
jre/lib/ext
以下にactivation.jarを入れました。そうするとうまく動作するようになりました。
本当はJBossの設定ファイル等に設定するのかもしれません。

ふーばーさん、おばけさん、ありがとうございました。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-03-01 17:37
引用:

おばけさん、ありがとうございます。この方法は今後もすごく使えますね。


解決されたようで、良かったです
kojiさんが書かれたようなJSPが、まさに私の言ったものです。
この方法は便利ですので、これからも使ってみてください。

koji
大ベテラン
会議室デビュー日: 2002/12/25
投稿数: 100
投稿日時: 2004-03-02 14:00
おばけさん、これからも使わせてもらいます。

JBoss3.2.3を使っているのですが、普通はWEB-INF/libにjarを入れれば
良いと思ったので、jreの方を消してWEB-INF/libに入れてみましたら、
正常動作しました。この前は駄目だったのになぜだろう?で、今度はそれ
も消してみました。それでも正常動作しました。JBossは再起動しても、
変更したクラスが更新されない現象が起こったり起こらなかったりしてい
ます。JBossのキャッシュ機能かなにかが働いているようです。その辺
の問題で何が正しいんだかわからなくなってきました。
mail.jarとactivation.jarはjboss-3.2.3/server/default/lib
以下に最初から入っているのですが、それで駄目だったので上記場所に
入れたり消したりしていたのですが。。。
まぁ、WEB-INF/libとjre/lib/extの両方に入れておけば良いって事です
かね。。。

ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)