- PR -

javamailに関するOS依存(?)による動作不具合

投稿者投稿内容
himawari
会議室デビュー日: 2005/03/04
投稿数: 13
投稿日時: 2005-03-05 01:10
初めての投稿です。プログラマ初心者ですがよろしくお願いします。

今回、javamailを使ったメール送信アプリを制作しているのですが、問題が発生しました。
テスト環境では意図する動作をしますが、サーバ環境では不動作となってしまうのです。

テスト環境:WindowsXP,Tomcat4.3
サーバ環境:Linux,Tomcat4.6

以下、要所説明をしたいと思います。

アプリケーション階層
root
 | mailsend.jsp
 |
 |---WEB-INF
    | web.xml
    |
    |---classes
        |---beans
           | MailSendBean.class

ファイル内容概要
mailsend.jsp
 メール送信必須項目をセット。MailSendBeanを呼び出し、戻り値を判別。
web.xml
 Tomcat4.0用のヘッダを記述。
MailSendBean.class
 メール送信用クラス。

言葉では難しいので、直接プログラムをご覧いただければと思います。

★mailsend.jsp★
<%@ page language="java" contentType="text/html; charset=Shift_JIS" %>
<jsp:useBean id="mail" scope="page" class="beans.MailSendBean">
<jsp:setProperty name="mail" property="smtpHost" value="smile.ocn.ne.jp"/>
<jsp:setProperty name="mail" property="from" value="xxx@xxxx.ne.jp"/>
<jsp:setProperty name="mail" property="to" value="xxx@xxxx.ocn.ne.jp"/>
<jsp:setProperty name="mail" property="subject" value="メールテスト"/>
<jsp:setProperty name="mail" property="body" value="てすと"/>
</jsp:useBean>
<html><head><title>てすと</title></head>
<body>
<% if(mail.send()){ %>
メールの送信成功
<% }else{ %>
メールの送信失敗
<% } %>
</body></html>


★web.xml★
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <!DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">
 <web-app>
 </web-app>


★MailSendBean.class★
package beans;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class MailSendBean{
private String mSmtpHost = null;
private String mFrom = null;
private String mTo = null;
private String mSubject = null;
private String mBody = null;

public String getSmtpHost(){ return mSmtpHost; }
public void setSmtpHost(String smtpHost){ this.mSmtpHost = smtpHost; }

public String getFrom(){ return mFrom; }
public void setFrom(String from){ this.mFrom = from; }

public String getTo(){ return mTo; }
public void setTo(String to){ this.mTo = to; }

public String getSubject(){ return mSubject; }
public void setSubject(String subject){ this.mSubject = subject; }

public String getBody(){ return mBody; }
public void setBody(String body){ this.mBody = body; }

public boolean send(){
try{
Properties props = System.getProperties();
props.put("mail.smtp.host",mSmtpHost);

Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);

InternetAddress from = new InternetAddress(mFrom);
message.setFrom(from);

InternetAddress to[] = InternetAddress.parse(mTo);
message.setRecipients(Message.RecipientType.TO,to);

message.setSubject(mSubject,"iso-2022-jp");

message.setSentDate(new Date());

message.setText(mBody,"iso-2022-jp");

Transport.send(message);

return true;

}catch(Exception e){
return false;
}
}
}


ローカル側の結果は「メール送信成功」となりますが、
サーバ側では「メール送信失敗」という結果になります。

サーバーはレンタルサーバーを使用しています。共有サーバーです。
私はLinuxでの開発経験がなく、どこの設定が違っているのか見当がつきません。
ネットでいろいろ調べたのですが、解決にはいたりませんでした。

どなたか何かお気づきの点がありましたらアドバイスいただければと思います。
お手数をおかけいたしますが、よろしくお願いします。

[ メッセージ編集済み 編集者: himawari 編集日時 2005-03-05 08:16 ]
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-03-05 01:54
せめてExceptionキャッチしたところでStackTraceぐらい出してください。

あと、このソースコードは問題が解決した後もずっと参照できる状態にしておくつもりなのですか?

あなたの問題が解決したあと他の誰かがこのトピックを参照した際にリンク切れだと意味がわからないですよね?
himawari
会議室デビュー日: 2005/03/04
投稿数: 13
投稿日時: 2005-03-05 08:12
mogeさん、早速のご返信ありがとうございました。

> せめてExceptionキャッチしたところでStackTraceぐらい出してください。

すみません。できればStackTraceの構文の書き方を教えていただけないでしょうか?
リファレンスを見ても今一よく分からないくて・・
それと、StackTraceした結果はどこに出力されるのでしょうか。

JSP、全くの初心者で書籍を参考にして作っています。よろしくお願いします。

> あなたの問題が解決したあと他の誰かがこのトピックを参照した際にリンク切れだと意味がわからないですよね?

こちらもフォーラムのルールを知らずにすみません。
投稿がごちゃごちゃすると思い、テキストファイルでの表示とさせていただきました。
修正します。

[ メッセージ編集済み 編集者: himawari 編集日時 2005-03-05 08:57 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-03-05 08:18
Exception クラスのAPIリファレンスを見ましょう。スタックトレースを出力するメソッドがあるはずです。
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2005-03-05 08:46
引用:

インギさんの書き込み (2005-03-05 08:18) より:
Exception クラスのAPIリファレンスを見ましょう。スタックトレースを出力するメソッドがあるはずです。


本来なら問題無いレスなんですが、投稿者はリファレンスの見方が良く分からないようなので、
インギさんの回答に補足しておきます。

リファレンスの「java.lang」パッケージの「Throwable」クラスを開いてみてください。
Throwableクラスは全ての例外クラスのスーパークラスですので、そのクラスで定義され
ているpublicなメソッドはどの例外クラスのインスタンスからも呼び出す事が可能です。
Throwableクラスにpublicなメソッドとして「printStackTrace()」というメソッドが
あり、このメソッドは例外の詳細説明を標準出力に書き出す働きをします。
書き出されたエラー内容は問題解決の為の大切な足掛かりとなりますので、大概catch節
には、このメソッドを呼び出す処理を最初の段階では記述します(printStakTrace()メソッド
の詳細説明にはサンプルコードも載っていますので参考にしてみて下さい)
この処理はバグを潰す為のプログラマの都合により記述され利用される性質のものです
から、当然問題点の洗い出しが終わりcatch節でのエラーの後処理が適切になされた段階
で削除するということになります。
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2005-03-05 16:04
スタックトレースがどこに出るか分からなければ、
とりあえずこんな感じでエラーメッセージを画面に表示してみては
いかがでしょうか?

★MailSendBean.class★
// エラーメッセージ保存用の変数を追加
private String errorMessage = "";
// エラーメッセージを返すメソッドを追加
public String getErrorMessage(){ return errorMessage; }
(中略)
}catch(Exception e){
// エラーメッセージを変数にセット
errorMessage = e.getMessage();
return false;
}

★mailsend.jsp★
<% if(mail.send()){ %>
メールの送信成功
<% }else{ %>
メールの送信失敗<BR>
<%= mail.getErrorMessage() %>
<% } %>
himawari
会議室デビュー日: 2005/03/04
投稿数: 13
投稿日時: 2005-03-07 08:50
返信が遅くなってしまい申し訳ありません。
インギさん、takamaroさん、taroさん、ご丁寧なアドバイスありがとうございました。
ご察しの通り、リファレンスの見方をよく知りませんでした。

まさしくエラーメッセージもどこへ出力されるのか分からないので
taroさんのコードをお借りしてテストしてみました。

--------------------------------------------------------------
メールの送信失敗
access denied (java.util.PropertyPermission * read,write)
--------------------------------------------------------------
その結果、Linux側で上記のようなエラーメッセージが出ました。

これがまた何を意味しているのか..
読み書きのアクセスが否定されています。(?)

誠に勝手なのですが、何か次のアドバイスをいただければと思います。
よろしくお願いします。

[ メッセージ編集済み 編集者: himawari 編集日時 2005-03-07 08:54 ]

[ メッセージ編集済み 編集者: himawari 編集日時 2005-03-07 09:06 ]

[ メッセージ編集済み 編集者: himawari 編集日時 2005-03-07 09:07 ]
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2005-03-07 16:12
少ないエラー情報で断定できませんが
Tomcatのセキュリティマネージャが有効になっていて
Propertyへのアクセスが制限されている為、
プロパティ情報へアクセスする際、
コード:
Properties props = System.getProperties(); 


Permissionエラーが発生していると思われます。

詳しくはここを参考に適切にTomcatの設定をする必要があります。

上記を試す前に、MailSendBean.classにpublic static mainメソッドを用意して
Jspでなく、単体で動くかの検証をした方がいいと思います。
なぜなら、他にも原因があるかも知れないので切り分けて考えやすくするためです。

その上で上記の問題に当たったらいいと思います。
コードで気になった点というか
コード:
Properties props = System.getProperties(); 


上記は
コード:
Properties props = new Properties(); 


でも問題ないと思いますのでこれでPermissionエラーは
回避できるかもしれません。

以上、がんばってみてください。


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