1

I'm new to Spring MVC. I've configured a mail session on Wildfly 8.0 Application server. I am using Spring 3.2. I am using a lookup like this:

<jee:jndi-lookup id="myMailSession"
             jndi-name="java:jboss/mail/Email"
             expected-type="javax.mail.Session" />

However, I am very much stuck trying to figure out how to do this in Java Config . How to migrate this xml based JNDI lookup to java configuration?

Kudpudeen
  • 83
  • 1
  • 6

3 Answers3

7

Finally I got it JNDI Lookup using java configuration.

@Bean
public JavaMailSenderImpl javaMailSenderImpl() {
    JavaMailSenderImpl mailSenderImpl = new JavaMailSenderImpl();
    mailSenderImpl.setSession(session());
    return mailSenderImpl;
}

public Session session(){
    JndiTemplate template = new JndiTemplate();
    Session session = null;
    try {
         session = (Session) template.lookup("java:jboss/mail/Email");
    } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return session;
}

This above code snippet is equivalent to JNDI Lookup mail xml configuration.

<jee:jndi-lookup id="myMailSession"
         jndi-name="java:jboss/mail/Email"
         expected-type="javax.mail.Session" /> 
Kudpudeen
  • 83
  • 1
  • 6
1

You can use spring mail to configure you mail sender

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:int="http://www.springframework.org/schema/integration"
        xmlns:int-mail="http://www.springframework.org/schema/integration/mail"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-3.2.xsd
               http://www.springframework.org/schema/integration
               http://www.springframework.org/schema/integration/spring-integration.xsd
               http://www.springframework.org/schema/util
               http://www.springframework.org/schema/util/spring-util-3.2.xsd
               http://www.springframework.org/schema/integration/mail
               http://www.springframework.org/schema/integration/mail/spring-integration-mail.xsd">

        <util:properties id="mailProperties"
            location="file:${mf_home}/conf/alertas/mail.properties" />

        <!-- Configuracion para velocity template para mensajes -->

        <bean id="velocityEngine"
            class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
            <property name="velocityProperties">
                <props>
                    <prop key="resource.loader">file</prop>
                    <prop key="file.resource.loader.class">
                        org.apache.velocity.runtime.resource.loader.FileResourceLoader
                    </prop>
                    <prop key="file.resource.loader.path">#{systemProperties['mf_home']}/conf/alertas/templates
                    </prop>
                    <prop key="file.resource.loader.cache">true</prop>
                </props>
            </property>
        </bean>

        <!-- Configuracion envio de correos -->
        <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">

            <property name="host" value="#{mailProperties['mail.smtp.host']}" />
            <property name="username" value="#{mailProperties['mail.smtp.user']}" />
            <property name="password" value="#{mailProperties['mail.smtp.password']}" />
            <property name="port" value="#{mailProperties['mail.smtp.port']}" />

            <property name="javaMailProperties">
                <props>
                    <prop key="mail.smtp.auth">#{mailProperties['mail.smtp.auth']}</prop>
                    <prop key="mail.smtp.starttls.enable">#{mailProperties['mail.smtp.starttls.enable']}</prop>
                </props>
            </property>
        </bean>

        <bean id="mailTransformerBean" class="com.praxis.desvucem.alarms.transformer.MailTransformer" />

    </beans>

And you only need import this config context to your main aplication context.

You will also need example code for use it:

package com.praxis.desvucem.alarms.transformer;

import java.util.HashMap;
import java.util.Map;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import javax.inject.Inject;
import org.apache.velocity.app.VelocityEngine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.integration.Message;
import org.springframework.integration.MessageHeaders;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.velocity.VelocityEngineUtils;

import com.praxis.desvucem.alarms.mensajes.Mensaje;
import com.praxis.desvucem.alarms.domain.MfCContactoAlarma;

    public class MailTransformer {

        private static Logger log = LoggerFactory.getLogger(MailTransformer.class);

        private String templateSufijo = "Email.vm";

        /**
         * Inyecta propiedades a from.
         */
        public @Value("#{mailProperties['mail.smtp.from']}")
        String from;

        /**
         * Inyecta propiedades a sendToUser.
         */
        public @Value("#{mailProperties['mail.send.user.default']}")
        String sendToUser;

        @Inject
        private VelocityEngine velocityEngine;

        @Inject
        private JavaMailSender mailSender;

        /**
         * Convierte mensajes de tipo Mensaje a MimeMessage y este pueda ser enviado
         * por el adaptador de mail.
         * @param msj {@link Mensaje} Mensaje Recive el mensaje
         * @return MimeMessage {@link MimeMessage} Regresa el mensaje convertido en
         * MimeMessage
         * @throws Exception al generar MimeMessage en MailTransformer
         */
        public MimeMessage mensajeToMimeMessage(Message<?> mensaje) {
            MfCContactoAlarma contactoAlarma = (MfCContactoAlarma) mensaje.getPayload();
            MessageHeaders header = mensaje.getHeaders();
            String mensajeReal = header.get("mensaje").toString();

            Map<String, Object> model = new HashMap<String, Object>();

            model.put("texto", mensajeReal);

            MimeMessage mimeMessage = null;

            String destinatarios = contactoAlarma.getConNombre();

            if (destinatarios == null) {

                log.info("Enviando mensaje  por correo al destinatario por defaul {}", sendToUser);
                // Se envia al usuario por default
                destinatarios = "sendToUser";
            }

            try {
                mimeMessage = armaMensajeConTextoDeTemplate(destinatarios, "Notificación automática VUCEM-MF", model,
                        "notificacion");
            }
            catch (Exception e) {
                log.error("Error al generar MimeMessage en MailTransformer ", e);
            }

            return mimeMessage;
        }

        private MimeMessage armaMensajeConTextoDeTemplate(String emails, String motivo, Map<String, Object> model,
                String template) throws MessagingException {

            String texto = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, template + templateSufijo, "utf-8",
                    model);
            if (log.isDebugEnabled()) {
                log.debug("Texto del e-mail '" + texto + "'");
            }

            return armaMensaje(emails, motivo, texto);
        }

        private MimeMessage armaMensaje(final String emails, final String motivo, final String texto)
                throws MessagingException {

            MimeMessage mensaje = mailSender.createMimeMessage();

            MimeMessageHelper helper = new MimeMessageHelper(mensaje);
            helper.addTo(emails);
            helper.setFrom(from);
            helper.setSubject(motivo);
            boolean isHTML = true;
            helper.setText(texto, isHTML);

            log.debug("Armando mensaje de correo, Para:[{}], De:[{}], Motivo:[{}] Mensaje:[{}]", emails, from, motivo,
                    texto);
            return mensaje;
        }
    }

Here I'm using velocity to format message with HTML, this will give you a great look and feel.

Miguel Resendiz
  • 339
  • 3
  • 13
0

You can define a @Configuration class and create a bean like this.

@Bean
public JndiObjectFactoryBean myMailSession() {
    JndiObjectFactoryBean bean = new JndiObjectFactoryBean();
    bean.setJndiName("java:jboss/mail/Email");
    
    return bean;
}

and in the @Bean where you use the jndi object you have to cast it:

Session mailSession = (Session) myMailSession().getObject();