Tomcat 5.5 の一部バージョンでは JavaMail の JNDI リソースが動かない
Tomcat のバージョンを 5.5.17 から 5.5.23 にあげたところ、次のような例外が発生するようになった。
javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.ClassNotFoundException: org.apache.naming.factory.MailSessionFactory]
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:132)
JNDI から JavaMail の javax.mail.Session
を取り出すときに失敗しているようだ。
「MailSessionFactory
が見つからないってことはまたクラスパス周りの問題かな、面倒くさいな…」と思いきや、検索してみると、次のようなバグ報告が。
Bug 40668 - MailSessionFactory is missing in Tomcat 5.5.23 http://issues.apache.org/bugzilla/show_bug.cgi?id=40668
Tomcat 5.5.20 から現時点での最新バージョンである 5.5.23 では Tomcat 自体のビルドプロセスに問題があって(クラスパスに JavaMail が含まれていない?)、naming-factory.jar
に JavaMail 関連のクラスがなくなっているらしい。
いまだに直ってない、ってのがすごいな。
この際、SMTP でメールを送信するくらいの用途なら、JNDI やめちゃうってのも手だと思う。JNDI のルックアップって非結合になっているようで、結局、新しい依存性を持ち込んでるだけ、というか、テストを考えると余計面倒だし。
Context context = new InitialContext();
Session session = (Session) context.lookup("java:comp/env/mail/Session");
これを
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
Session session = Session.getDefaultInstance(props);
こんな感じで。