- - PR -
javamailに関するOS依存(?)による動作不具合
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2005-03-05 01:54
せめてExceptionキャッチしたところでStackTraceぐらい出してください。
あと、このソースコードは問題が解決した後もずっと参照できる状態にしておくつもりなのですか? あなたの問題が解決したあと他の誰かがこのトピックを参照した際にリンク切れだと意味がわからないですよね? | ||||||||||||
|
投稿日時: 2005-03-05 08:12
mogeさん、早速のご返信ありがとうございました。
> せめてExceptionキャッチしたところでStackTraceぐらい出してください。 すみません。できればStackTraceの構文の書き方を教えていただけないでしょうか? リファレンスを見ても今一よく分からないくて・・ それと、StackTraceした結果はどこに出力されるのでしょうか。 JSP、全くの初心者で書籍を参考にして作っています。よろしくお願いします。 > あなたの問題が解決したあと他の誰かがこのトピックを参照した際にリンク切れだと意味がわからないですよね? こちらもフォーラムのルールを知らずにすみません。 投稿がごちゃごちゃすると思い、テキストファイルでの表示とさせていただきました。 修正します。 [ メッセージ編集済み 編集者: himawari 編集日時 2005-03-05 08:57 ] | ||||||||||||
|
投稿日時: 2005-03-05 08:18
Exception クラスのAPIリファレンスを見ましょう。スタックトレースを出力するメソッドがあるはずです。
| ||||||||||||
|
投稿日時: 2005-03-05 08:46
本来なら問題無いレスなんですが、投稿者はリファレンスの見方が良く分からないようなので、 インギさんの回答に補足しておきます。 リファレンスの「java.lang」パッケージの「Throwable」クラスを開いてみてください。 Throwableクラスは全ての例外クラスのスーパークラスですので、そのクラスで定義され ているpublicなメソッドはどの例外クラスのインスタンスからも呼び出す事が可能です。 Throwableクラスにpublicなメソッドとして「printStackTrace()」というメソッドが あり、このメソッドは例外の詳細説明を標準出力に書き出す働きをします。 書き出されたエラー内容は問題解決の為の大切な足掛かりとなりますので、大概catch節 には、このメソッドを呼び出す処理を最初の段階では記述します(printStakTrace()メソッド の詳細説明にはサンプルコードも載っていますので参考にしてみて下さい) この処理はバグを潰す為のプログラマの都合により記述され利用される性質のものです から、当然問題点の洗い出しが終わりcatch節でのエラーの後処理が適切になされた段階 で削除するということになります。 | ||||||||||||
|
投稿日時: 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() %> <% } %> | ||||||||||||
|
投稿日時: 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 ] | ||||||||||||
|
投稿日時: 2005-03-07 16:12
少ないエラー情報で断定できませんが
Tomcatのセキュリティマネージャが有効になっていて Propertyへのアクセスが制限されている為、 プロパティ情報へアクセスする際、
Permissionエラーが発生していると思われます。 詳しくはここを参考に適切にTomcatの設定をする必要があります。 上記を試す前に、MailSendBean.classにpublic static mainメソッドを用意して Jspでなく、単体で動くかの検証をした方がいいと思います。 なぜなら、他にも原因があるかも知れないので切り分けて考えやすくするためです。 その上で上記の問題に当たったらいいと思います。 コードで気になった点というか
上記は
でも問題ないと思いますのでこれでPermissionエラーは 回避できるかもしれません。 以上、がんばってみてください。 |