Banear

domingo, 13 de enero de 2013

Envíar correos con Java, Spring y Velocity

- Velocity: Nos sirve para trabajar con plantillas
- JavaMail: Se encarga del envío del correo
- Spring: Responsable de inyectar los beans

Supongamos que tenemos montado un proyecto con Spring y Maven. Lo primero de todo es añadir las dependencias necesarias para realizar el envío de correos al pom.xml:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>velocity</groupId>
    <artifactId>velocity</artifactId>
    <version>1.5</version>
</dependency>

<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>

A continuación, nos creamos la plantilla velocity usando html, la llamaremos email-template.vm:

<html>

<body>

<h3>Hola ${user.username}, bienvenido!</h3>

<div>

   Tu correo electrónico es: <a href="mailto:${user.emailAddress}">${user.emailAddress}</a>.

</div>

</body>

</html>

Ahora añadimos la configuración en spring (en nuestro applicationContext.xml o cualquier otro archivo xml de spring siempre y cuando lo añadáis al classpath). Lo configuraremos para gmail, pero podéis modificarlo para que use otros proveedores.

<!-- Estas dos líneas quizás ya las tengáis, pero las añado por si acaso -->

<context:annotation-config />

    <context:component-scan base-package="com.mycompany"/>

<!-- Debéis usar vuestro usuario y password de vuestra cuenta de gmail u os dará error de conexión (timeout) -->

   <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">

      <property name="host"><value>smtp.gmail.com</value></property>

        <property name="port"><value>587</value></property>

        <property name="protocol"><value>smtp</value></property>

        <property name="username"><value>loquesea</value></property>

        <property name="password"><value>loqueseapw</value></property>

        <property name="javaMailProperties">

            <props>

                <prop key="mail.smtp.auth">true</prop>

                <prop key="mail.smtp.starttls.enable">true</prop>

                <prop key="mail.smtp.quitwait">false</prop>

            </props>

        </property>

   </bean>

<!-- El bean de velocity -->

   <bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">

      <property name="velocityProperties">

         <value>

            resource.loader=class

            class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

         </value>

      </property>

   </bean>

Finalmente, la clase para probar el envío. No es más que un main.

package com.mycompany.manager.impl;

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

import javax.mail.internet.MimeMessage;

import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Component;
import org.springframework.ui.velocity.VelocityEngineUtils;

import com.mycompany.model.User;

@Component("sendEmailTest")
public class SendEmailTest {
    private JavaMailSender mailSender;
    private VelocityEngine velocityEngine;
 
    public JavaMailSender getMailSender() {
        return mailSender;
    }
 
    @Autowired
    @Required
    public void setMailSender(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }
 
    public VelocityEngine getVelocityEngine() {
        return velocityEngine;
    }
 
    @Autowired
    @Required
    public void setVelocityEngine(VelocityEngine velocityEngine) {
        this.velocityEngine = velocityEngine;
    }
 
    public static void main(String[] args) {
        // Inicializamos el contexto de Spring
        ApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "applicationContext.xml" });
        SendEmailTest app = (SendEmailTest) context.getBean("sendEmailTest");
        // LLamamos al método que prueba el envío del correo
        app.testEmail();
    }
 
    public void testEmail() {
        final User user = new User();
        user.setEmailAddress("loquesea@gmail.com");
        user.setUsername("loquesea");
 
        MimeMessagePreparator preparator = new MimeMessagePreparator() {
            public void prepare(MimeMessage mimeMessage) throws Exception {
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
                message.setTo(user.getEmailAddress());
                message.setFrom("loquesea@gmail.com"); 
                message.setSubject("Prueba velocity");
                message.addAttachment("perfil.png", new ClassPathResource("perfil.png"));
                
                Map model = new HashMap();
                model.put("user", user);
                String text = VelocityEngineUtils.mergeTemplateIntoString(
                        velocityEngine, "email-template.vm", model);
                message.setText(text, true);
            }
        };
        this.mailSender.send(preparator);
    }
} 
Si lanzamos el main, y vamos a nuestra cuenta de correo veremos algo como esto (bueno, en los espacios en blanco que he editado en la imagen, saldría vuestro usuario ;)):
Recordar:

Otra opción para probar cómodamente el envío de correos es instalar PostCast Server, dónde pondréis a vuestra máquina como servidor SMTP.
http://www.postcastserver.com/download/release.aspx?p=3

Y ya puestos, si queréis formatear el código de vuestras entradas en un blog, os recomiendo esta página: http://tohtml.com/

No hay comentarios:

Publicar un comentario