<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Lucas Teixeira &#187; ioc</title>
	<atom:link href="http://lucastex.com.br/tag/ioc/feed/" rel="self" type="application/rss+xml" />
	<link>http://lucastex.com.br</link>
	<description>@lucastex</description>
	<lastBuildDate>Fri, 07 Jan 2011 12:44:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Enviando emails com Spring e Velocity</title>
		<link>http://lucastex.com.br/2009/10/08/enviando-emails-com-spring-e-velocity/</link>
		<comments>http://lucastex.com.br/2009/10/08/enviando-emails-com-spring-e-velocity/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 12:53:52 +0000</pubDate>
		<dc:creator>Lucas Teixeira</dc:creator>
				<category><![CDATA[Spring]]></category>
		<category><![CDATA[Velocity]]></category>
		<category><![CDATA[ioc]]></category>
		<category><![CDATA[mail]]></category>

		<guid isPermaLink="false">http://lucastex.com.br/?p=5</guid>
		<description><![CDATA[

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 [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Flucastex.com.br%252F2009%252F10%252F08%252Fenviando-emails-com-spring-e-velocity%252F%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Enviando%20emails%20com%20Spring%20e%20Velocity%22%20%7D);"></div>
<p>Primeiro post do meu blog totalmente em português!</p>
<p>Esta semana, precisei adicionar na aplicação a funcionalidade de enviar e-mails usando templates do <a href="http://velocity.apache.org/" target="_blank">Velocity</a> 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 <a href="http://www.springsource.org/" target="_blank">Spring</a> 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).</p>
<p>Bom, explicando brevemente como resolvi o problema:</p>
<ul>
<li>Bean <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/ui/velocity/VelocityEngineFactoryBean.html" target="_blank">VelocityEngineFactoryBean</a></li>
</ul>
<p>Defini este bean no applicationContext.xml para controlar a injeção do <a href="http://www.jdocs.com/velocity/1.5/org/apache/velocity/app/VelocityEngine.html" target="_blank">VelocityEngine</a></p>
<pre class="brush: xml; title: ;">&lt;bean id=&quot;velocityEngine&quot; class=&quot;org.springframework.ui.velocity.VelocityEngineFactoryBean&quot;&gt;
  &lt;property name=&quot;resourceLoaderPath&quot; value=&quot;/WEB-INF/templates/&quot; /&gt;
&lt;/bean&gt;</pre>
<p>Notem que a propriedade <strong>resourceLoaderPath </strong>já é definida ali, e é neste diretório indicado que os templates deverão estar.</p>
<ul>
<li>Bean <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/mail/javamail/JavaMailSender.html" target="_blank">JavaMailSenderImpl</a></li>
</ul>
<p>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</p>
<pre class="brush: xml; title: ;">&lt;bean id=&quot;mailSender&quot; class=&quot;org.springframework.mail.javamail.JavaMailSenderImpl&quot;&gt;
  &lt;property name=&quot;host&quot; value=&quot;${mail.smtp.host}&quot; /&gt;
  &lt;property name=&quot;username&quot; value=&quot;${mail.smtp.user}&quot; /&gt;
  &lt;property name=&quot;password&quot; value=&quot;${mail.smtp.pass}&quot; /&gt;
  &lt;property name=&quot;port&quot; value=&quot;${mail.smtp.port}&quot; /&gt;
&lt;/bean&gt;</pre>
<ul>
<li>Bean <a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/mail/SimpleMailMessage.html" target="_blank">SimpleMailMessage</a></li>
</ul>
<p>Este é o bean que será o template da mensagem. É um &#8220;modelo&#8221; de mensagem, que carrega o endereço &#8216;from&#8217; e também o subject do e-mail do mesmo arquivo de configuração.</p>
<pre class="brush: xml; title: ;">&lt;bean id=&quot;templateMailMessage&quot; class=&quot;org.springframework.mail.SimpleMailMessage&quot;&gt;
  &lt;property name=&quot;from&quot; value=&quot;${mail.from}&quot; /&gt;
  &lt;property name=&quot;subject&quot; value=&quot;${mail.subject}&quot; /&gt;
&lt;/bean&gt;</pre>
<p>Com isso, já tenho os 3 beans que serão injetados em meu componente de envio de e-mails.</p>
<ul>
<li>Template velocity do e-mail</li>
</ul>
<p>O template que eu criei para o teste é bem simples e segue abaixo. Se chama <strong>mail.vm</strong> e como dito ali em cima, está dentro de <strong>/WEB-INF/templates/</strong></p>
<pre class="brush: css; title: ;">Oi ${nome}, seu e-mail (${email}) foi cadastrado no sistema.</pre>
<ul>
<li>Componente final para o envio do e-mail</li>
</ul>
<p>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.</p>
<pre class="brush: java; title: ;">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&lt;String, Object&gt; ctx= new HashMap&lt;String, Object&gt;() {{
      put(&quot;nome&quot;, nome);
      put(&quot;email&quot;, email);
    }};

    String body = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, template, ctx);
    SimpleMailMessage msg = new SimpleMailMessage(this.templateMailMessage);
    msg.setTo(to);
    msg.setText(body);

    mailSender.send(msg);
  }
}</pre>
<p>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</p>
<pre class="brush: java; title: ;">@Autowired
private MailComponent mailComponent</pre>
<p>E enviar os e-mails aos usuários:</p>
<pre class="brush: java; title: ;">//Envia e-mail para o usuário com cópia ao admin
mailComponent.sendMail(&quot;mail.vm&quot;, &quot;Lucas&quot;, &quot;mail@mail.org&quot;, &quot;mail@mail.org&quot;, &quot;admin@site.org&quot;);</pre>
<p>É isso aí.</p>
<p>[]s,</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 122px; width: 1px; height: 1px;">VelocityEngineFactoryBean</div>

]]></content:encoded>
			<wfw:commentRss>http://lucastex.com.br/2009/10/08/enviando-emails-com-spring-e-velocity/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

