NetBeansよいうよりglassfishの話だけれども、NetBeansとセットで使うことが一番多いのでこのタイトルでいいや。
Javaでメールを送信するときにはJavaMailを使うのが普通なわけだが、NetBeansではJavaSEなプロジェクトであればJavaMailを位置からセットアップするコードが自動生成され、JavaEE(EJB)のプロジェクトならばJNDIから取得するコードが生成される。
自前で位置からセットアップする場合は問題はないのだが、JNDIで取得する場合はまりそうな箇所があるのでここに紹介しておく。
通常「mail.from」などのプロパティはJavaMailSessionsのところに登録しておくのが普通だ。利用するときはここから取得するだけ。楽チン楽チン・・・とおもうと見事にはまる。なんと「mail.smtp.port」が無視されるのだ。どうもglassfishは決まったキー値以外は削除しているようだ。一般的に使われる「mail.smtp.port」が設定できないのはかなり不便。おかげでコードで以下のようにJNDIで取得したセッションに追加してあげないといけない。
session.getProperties().setProperty("mail.smtp.port", port);
情けない。ほかにも、環境設定をここに追加したのをすべて有効にしておいてくれるとIDやパスワードもここに記述できて便利なんだけど。なぜならIDやパスワードはSMTPのセッションをつなぐときにわざわざいれてあげないといけないからだ。
正直ここまで手がかかるとJNDIで取得してくる意味がまるでない。2年前の実装ならこれでよかったのだろうが、SMTPはいまや25で接続することはほぼできなくなり、ポート番号:587でIDとパスワードをつかって送るのが常識だ。上記の設定をコード中に入れないとポート25につなぎにいこうとしてはねられる。
glassfishは世の中の動きがわかってないよなーとおもた。したがってNetBeansで設定されたコードがかなりの部分使えない。IDとパスワードも自動で設定されるキー値もJavaMailは定義しておくべきだとおもう。
たとえばJDBCのデータソースを取得するのに、JNDIで取得したあとIDとパスワード、さらにポート番号をコードで渡すなんてことは考えられないはず。それが必要な時点でおかしい気がする。
せめてglassfishのキー値のホワイトリスト以外も通してほしい。そうすればコードのほうからそこを取得することができる。
そういやメッセージドリブンビーンでエンタープライズリソースのEJB呼び出しをすると100%エラーが出るのはなんでだろ。無理やり何度か押して強制続行して一応問題なく動いているように見えるけど、激しく気持ちが悪い。