忍者ブログ

「JavaMailでjavax.mail.SessionがSingletonの罠(仕様ですけど)」の詳細記事: Javaってまだいけますか

Javaってまだいけますか

いっぱいいっぱいで無理なので学んだ事をいちいちメモっていくブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Navigation

JavaMailでjavax.mail.SessionがSingletonの罠(仕様ですけど)

JavaMailではまったのでメモ。

以下のようなメール送信クラスを作成してメール送信を行おうとしました。
import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.commons.validator.GenericValidator;

public class Mailer {
 
private String smtpHost;

 
private String smtpPort;

 
private String fromAddress;

 
public Mailer(String smtpHost, String smtpPort, String fromAddress) {
   
this.smtpHost = smtpHost;
   
this.smtpPort = smtpPort;
   
this.fromAddress = fromAddress;
 
}

 
public void send(String to, String cc, String subject, String body) {

   
try {
     
// メール送信準備
     
Properties props = new Properties();
      props
.put("mail.smtp.host", smtpHost);
      props
.put("mail.smtp.port", smtpPort);
      props
.put("mail.host", smtpHost);

     
Session session = Session.getDefaultInstance(props, null);

     
// メール作成
     
MimeMessage mimeMessage = new MimeMessage(session);
      mimeMessage
.addFrom(InternetAddress.parse(fromAddress));
      mimeMessage
.setRecipients(Message.RecipientType.TO, InternetAddress
         
.parse(to));
     
if (!GenericValidator.isBlankOrNull(cc)) {
        mimeMessage
.setRecipients(Message.RecipientType.CC,
           
InternetAddress.parse(cc));
     
}
      mimeMessage
.setSubject(subject, "iso-2022-jp");
      mimeMessage
.setText(body, "iso-2022-jp");
      mimeMessage
.setSentDate(new Date());

     
// 送信
     
Transport.send(mimeMessage, mimeMessage.getAllRecipients());

   
} catch (Exception e) {
      e
.printStackTrace();
   
}
 
}
}

で、コンストラクタで外部からSMTPホスト名とPORT名を与えて送信先メールサーバを切り替えようとしたけど、いくら外から設定しても最初に設定した送信先から切り替わらず・・・。

調べたところ、これが曲者でした。
Session session = Session.getDefaultInstance(props, null);

getDefaultInstanceがSessionのSingletonオブジェクトを返すようになっていた為、最初の設定がずっとキャッシュされてたんですね。。。

以下のように変えたら毎回設定が反映されるようになりました。
Session session = Session.getInstance(props);

※getInstanceの中身はSessionをnewして返してるだけ。

JavaMail
PR

Navigation

「JavaMailでjavax.mail.SessionがSingletonの罠(仕様ですけど)」にトラックバックする

「JavaMailでjavax.mail.SessionがSingletonの罠(仕様ですけど)」へのトラックバック

「JavaMailでjavax.mail.SessionがSingletonの罠(仕様ですけど)」へのコメント

「JavaMailでjavax.mail.SessionがSingletonの罠(仕様ですけど)」にコメントする

コメント作成

Navigation

Copyright ©  Javaってまだいけますか  All Rights Reserved.
  • 忍者ブログ
  • [PR]

menu

ブログ内検索

カテゴリー

カウンター

忍者アド

リンク

最新CM

[07/17 セバ]
[12/27 NONAME]

最新記事

(10/15)
(10/01)
(08/12)
(08/12)
(08/11)

プロフィール

HN:
takacy.k
年齢:
45
性別:
男性
誕生日:
1979/08/13
趣味:
自己紹介:
個人的なメモですので、投稿内容について真偽を保証するものではありません。また、当ブログの内容をご利用になったことによる(以下略)

最新TB

RSS

アーカイブ

アクセス解析