dev@glassfish.java.net

Re: Javamail/JNDI help?

From: Sahoo <sahoo_at_sun.com>
Date: Wed, 20 Jun 2007 22:13:48 +0530

Hi Gary,

You should first define a resource reference and associate the JNDI name
with the resource reference. In your code, you should use the resource
reference. Here are a couple of ways of doing this:

1. Using web.xml:
------------------------
Add the following lines to your web.xml:
  <!-- Here the name of the resource reference is mail/foo and it is
associated with the MailSession with global JNDI name as
mail/awardsNotification-->
  <resource-ref>
    <res-ref-name>mail/foo</res-ref-name>
    <res-type>javax.mail.Session</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
    <mapped-name>mail/awardsNotification</mapped-name>
  </resource-ref>

Now your code looks like this:

javax.mail.Session s = (javax.mail.Session) new
InitialContext("java:comp/env/mail/foo");

2. Using dependency injection:
---------------------------------------
If you are using Java EE 5 features, then you don't have to worry about
web.xml or JNDI look up. Simply write the following line in your Servlet
or managed web component:
@Resource(name="mail/foo", mappedName="mail/awardsNotification")
private javax.mail.Session s;

Hope this helps.

Thanks,
Sahoo

p.s.:
A complete Java EE application that uses Mail session is available at
http://weblogs.java.net/blog/ss141213/foss_2006_demo/VisitorRegistration_src.zip.

Unzip and take a look at VisitorRegistrationService.java, which uses
resource injection to inject a mail session. The injected Session is
used inside sendMail() in that EJB. The application is described at
http://weblogs.java.net/blog/ss141213/archive/2006/11/welcome_to_glas.html.
The injection code and sendMail() should also work for a web app with
version > 2.5.


Gary Horton wrote:
> Ken Paulsen has pointed me here to ask for help wrt correctly setting
> up a JavaMail session in glassfish. I have set up the session, but
> cannot successfully locate the resource using JNDI.
>
> My goal is to send out a simple text message via javamail from my
> webapp, deployed to glassfish. From reading the Admin manual
> (http://docs.sun.com/app/docs/doc/819-3658/6n5s5nkm4?a=view), I
> configure JavaMail sessions with the following JNDI names:
>
> comp/env/mail/awardsNotification
> mail/awardsNotification
> awardsNotification
>
> I used several variations because my initial attempt using just
> the 1st one (comp/env/mail/awardsNotification) didn't work out, so I
> thought I must have been approaching the naming incorrectly.
>
> I then put together some test code that in effect does what the
> glassfish manual describes
> (https://glassfish.dev.java.net/javaee5/docs/DG/beaow.html):
>
> private Session getMailSession(String jndiName) {
> try {
> InitialContext ic = new InitialContext();
> logger.info(jndiName + "...");
> Session session = (Session)ic.lookup(jndiName);
> logger.info("Success!");
> return session;
> } catch (Exception ex) {
> this.logger.error("Failed: " + ex);
> return null;
> }
> }
>
> Then I try it out finding any of the 3 JNDI resources with each of the
> following JNDI name arguments, but they all fail. Here are the
> arguments sent to the above method:
>
> 1. mail:comp/env/mail/awardsNotification
> 2. java:comp/env/mail/awardsNotification
> 3. java:mail/awardsNotification
> 4. mail:mail/awardsNotification
> 5. comp/env/mail/awardsNotification
> 6. mail/awardsNotification
> 7. mail:awardsNotification
> 8. awardsNotification
>
> The output generated from these tests tell me, when I use #5, #6 or
> #8, that I'm getting back a MailConfiguration object instead of a
> Session object. I believe this is the problem, but I have no clue how
> to remedy this.
>
> Here's the detailed output from invoking the getMailSession method
> with the above arguments:
>
> 1. mail:comp/env/mail/awardsNotification...Failed: null
> 2. java:comp/env/mail/awardsNotification...Failed: No object bound
> to name java:comp/env/mail/awardsNotification
> 3. java:mail/awardsNotification...Failed: No object bound to name
> java:mail/awardsNotification
> 4. mail:mail/awardsNotification...Failed: null
> 5. comp/env/mail/awardsNotification...Failed:
> java.lang.ClassCastException:
> com.sun.enterprise.deployment.MailConfiguration
> 6. mail/awardsNotification...Failed: java.lang.ClassCastException:
> 7. mail:awardsNotification...Failed: mail:awardsNotification not found
> 8. awardsNotification...Failed: java.lang.ClassCastException:
> com.sun.enterprise.deployment.MailConfiguration
>
> Can someone tell me what I'm doing wrong? Thanks in advance - and if
> you would, please cc me in your reply, since I'm not on this alias --
> -gh