Arquivo para a tag ‘ioc’
Enviando emails com Spring e Velocity
Primeiro post do meu blog totalmente em português!
Esta semana, precisei adicionar na aplicação a funcionalidade de enviar e-mails usando templates do Velocity para o corpo do e-mail. Claro que o poderíamos usar o arroz com feijão do Velocity para isso, fazendo o merge do template com nosso contexto de variáveis, mas acabei esbarrando em um site, e descobri que o próprio Spring já possui um FactoryBean para a criação do meu VelocityEngine além de também ficar responsável com o carregamento dos templates (na minha opinião, a parte mais chata).
Bom, explicando brevemente como resolvi o problema:
Defini este bean no applicationContext.xml para controlar a injeção do VelocityEngine
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean"> <property name="resourceLoaderPath" value="/WEB-INF/templates/" /> </bean>
Notem que a propriedade resourceLoaderPath já é definida ali, e é neste diretório indicado que os templates deverão estar.
- Bean JavaMailSenderImpl
Este bean do core do spring já encapsula o envio da mensagem, neste exemplo, está configurado com estas propriedades que vieram de um arquivo de propriedades que carreguei no início do meu applicationContext.xml
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.smtp.host}" />
<property name="username" value="${mail.smtp.user}" />
<property name="password" value="${mail.smtp.pass}" />
<property name="port" value="${mail.smtp.port}" />
</bean>
- Bean SimpleMailMessage
Este é o bean que será o template da mensagem. É um “modelo” de mensagem, que carrega o endereço ‘from’ e também o subject do e-mail do mesmo arquivo de configuração.
<bean id="templateMailMessage" class="org.springframework.mail.SimpleMailMessage">
<property name="from" value="${mail.from}" />
<property name="subject" value="${mail.subject}" />
</bean>
Com isso, já tenho os 3 beans que serão injetados em meu componente de envio de e-mails.
- Template velocity do e-mail
O template que eu criei para o teste é bem simples e segue abaixo. Se chama mail.vm e como dito ali em cima, está dentro de /WEB-INF/templates/
Oi ${nome}, seu e-mail (${email}) foi cadastrado no sistema.
- Componente final para o envio do e-mail
Chamei o componente de MailComponent (bem criativo, né?), e a única coisa que ele faz, é receber os beans que definimos via injeção, criar uma nova mensagem usando o template de e-mails e setar como body da mensagem o resultado do merge entre o template e as minhas variáveis. Segue o código do componente.
import java.util.HashMap;
import java.util.Map;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Component;
import org.springframework.ui.velocity.VelocityEngineUtils;
@Component
public class MailComponent {
@Autowired
private MailSender mailSender;
@Autowired
private SimpleMailMessage templateMailMessage;
@Autowired
private VelocityEngine velocityEngine;
public void sendMail(String template, Stirng nome, String email, String ... to) {
Map<String, Object> ctx= new HashMap<String, Object>() {{
put("nome", nome);
put("email", email);
}};
String body = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, template, ctx);
SimpleMailMessage msg = new SimpleMailMessage(this.templateMailMessage);
msg.setTo(to);
msg.setText(body);
mailSender.send(msg);
}
}
Pronto, o componente está pronto, agora a qualquer momento, em qualquer classe (que tenha acesso ao contexto de DI do spring é claro) você poderá chamar o seu componente
@Autowired private MailComponent mailComponent
E enviar os e-mails aos usuários:
//Envia e-mail para o usuário com cópia ao admin
mailComponent.sendMail("mail.vm", "Lucas", "mail@mail.org", "mail@mail.org", "admin@site.org");
É isso aí.
[]s,