- PR -

JavaMail送信時に使用するPropertiesインスタンスの取得方法について

1
投稿者投稿内容
FZR
常連さん
会議室デビュー日: 2007/09/10
投稿数: 42
投稿日時: 2008-01-22 11:46
いつもお世話になっております。FZRと申します。

Javaによるメール送信プログラムの中で、理解に至らない部分が出てきましたので、ご存 じ方がおられましたら教示いただけませんでしょうか。現在、開発はWin-XP SP2上でEclipse 3.0、JVMは1.4.2_10または1.5.0_13を利用しており、JavaMailは1.4.1、JAFは1.1.1を、WEB-INF配下のlibに同梱して使用しています。

パッケージングしたプログラムは最終的にはLinux上で動作させる予定です。

以下のような簡単なメソッドを用意しました。

public boolean sendMail(){
boolean result = false;

Properties props = System.getProperties();          (1)
//Properties props = new Properties(System.getProperties()); (2)
//Properties props = new Properties(); (3)

props.put("mail.smtp.host", smtpHost);
Session session = Session.getDefaultInstance(props, null);
MimeMessage mm = new MimeMessage(session);
try{
mm.setFrom(new InternetAddress(this.from, this.sender, "ISO-2022-JP"));
mm.setRecipients(Message.RecipientType.TO, this.to);
mm.setSubject(this.subject, "ISO-2022-JP");
mm.setText(this.text, "ISO-2022-JP");
mm.setHeader("Content-Type", "text/plain");
mm..setSentDate(new Date());
Transport.send(mimeMessage);
result = true;
}catch(MessagingException ex){
ex.printStackTrace();
}catch(UnsupportedEncodingException ex) {
ex.printStackTrace();
}
return result;
}

この中で、Properties propsを取得するために3種のコードを用意したのですが、(1)の方法では問題なく送信できるのに、(2)及び(3)ではMessagingException: Could not connect to SMTP host: localhost, port: 25が発生し送信に失敗してしまいます。

このフォーラムも含め、巷のサンプル等を参照しますと(3)のnew Properties()を推奨されている方もおられますし、本来的には(2)new Properties(System.getProperties())とするべきではないか?と言う記事も見かけます。

ただ実際のところ、現在の私の環境では(1)しか動作いたしません。

これらの違いは何に起因するものなのでしょうか?
またこの問題の改善策にはどのように方法がございますでしょうか?
何か情報をお持ちの方がおられましたら、回答方よろしくお願いいたします。
ranco
大ベテラン
会議室デビュー日: 2007/11/02
投稿数: 112
投稿日時: 2008-01-22 13:33
> 現在の私の環境では(1)しか動作いたしません。
たぶん、「ホンモノのシステムプロパティ」でないとだめだからでしょう。(2)(3)のような新しい空のプロパティなら、 props.put("mail.smtp.host", smtpHost)してもシステムプロパティにはまったく反映されませんからね。JavaMailがシステムプロパティを読みに行っても、当該key:valueが見つかりません。
FZR
常連さん
会議室デビュー日: 2007/09/10
投稿数: 42
投稿日時: 2008-01-22 15:16
# rancoさん

早速のお返事ありがとうございます。

>>「ホンモノのシステムプロパティ」でないとだめだからでしょう。

と仰るのはニュアンス的には判るのですが、だとしたら巷でサンプルとして出回っているソースで(特に)new Properties();と記述されるのを見かけるのは何故なのでしょう?サンプルを掲げるからには、簡単な動作確認はされていると思うのですが...しかもココ、@ITの記事でも見かけるのです。>Java Tips

http://www.atmarkit.co.jp/fjava/javatips/123java022.html

そこに何かしら私の環境と異なる部分があるのではないか?と邪推してしまうのです。
tnk
会議室デビュー日: 2005/06/10
投稿数: 11
投稿日時: 2008-01-22 19:56
お世話になります。

getDefaultInstance メソッドですので、すでにデフォルトのSessionオブジェクトが
「ホンモノのシステムプロパティ」で生成されてしまっているのではないでしょうか。

getDefaultInstanceの代わりに
getInstance メソッドを使ってみるとどうでしょう?
FZR
常連さん
会議室デビュー日: 2007/09/10
投稿数: 42
投稿日時: 2008-01-23 10:29
# tnkさん

メッセージありがとうございます。

getInstance()を使ってテストしてみましたところ

System.getProperties();
new Properties(System.getProperties());
new Properties();

のいずれでもメールが送信できることを確認しましたが、未だに何故動作結果が異なるのかが理解できずにいます。

getInstance()とgetDefaultInstance()でSessionオブジェクトを作り、Eclipseの変数ビューで(人間の目で)見比べたかぎりでは、その違いがわかりませんでした。

次にPropertiesオブジェクトを前述の3通りで作り同様に見比べたところ、System.getProperties()とその他2者では内容が違うことを確認しています。ですが、そのHashtable中にメールに関する設定値については見られず、mail.transport.protocol等もありませんでしたし、mail.smtp.hostについてはPropertiesオブジェクト取得後に設定しているのに、何故にこのような違いが発生するのか、不思議に感じています。

そもそも、getDefaultInstance()で取得したSessionオブジェクトも、渡されたPropertiesオブジェクトの値(mail.smtp.host)が有効になっているので、新たにSessionオブジェクトを取得していることになると思いますし、そうなるとgetInstance()で取得した場合と何か違うのか...適用されるデフォルト値のどこが違うのか、が判らずに苦慮しています。

と言うか、そもそも考え方が違うのでしょうか?
ここで言う「デフォルト値」と言うのは、PropertiesオブジェクトのHashtableに格納されている値だけではないのでしょうか?
FZR
常連さん
会議室デビュー日: 2007/09/10
投稿数: 42
投稿日時: 2008-01-23 11:49
先ほどのメッセージを書き終わり、再度それぞれの組み合わせでテストしてみたところ、今度は全6通りの組み合わせ全てでメールが送信されることを確認しました。結局は一時的な環境の問題だった...と言うわけでしょうか?

昨日はgetDefaultInstance()だけしか試していませんでしたが、それでも3通りのテストを何度もやってみたのですが...

1つ不可解なのは、new Properties(System.getProperties())で取得されるオブジェクトの内容がnew Properties()で取得されるものと同じになっていることです。自分としてはSystem.getProperties()で取得されたものと同じであるべきではないか?と思うのですが...

ただメール送信を繰り返し行う場合は、getDefaultInstance()だと最初に呼び出されたときに渡されたPropertiesオブジェクトが二回目以降の呼びだし時にも使われるようなので、getInstance()を使った方がよさそうな気がしてます。

[ メッセージ編集済み 編集者: FZR 編集日時 2008-01-23 12:31 ]
1

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