Enviando e-mail em Html com Grails, Spring e GroovyTemplate

Uma tarefa comum em aplicações web é o envio de e-mail. Vou mostrar um exemplo simples, bem prático, para envio de e-mails com o Grails, usando algumas classes de suporte a emails do Spring.

O GroovyTemplate é um template engine, estilo Velocity Templates, escrito em groovy e disponível para nós em aplicações baseadas no Grails.

O exemplo é de uma loja virtual que ao final do pedido deve enviar um email de confirmação de pedido para o cliente.

Crie o seu template

Eu criei um template para ser processado pelo GroovyTemplate em /WEB-INF/orderNotification.gtpl
(eu inventei este gtpl para ser Groovy Template, mas poderia ser qualquer extensão).

Este arquivo seria algo do tipo:

<body style="font-family:Verdana, Arial, Helvetica, sans-serif;font-size:11px">

<div align="center">
<strong>Loja Virtual</strong><br />
Rua XXxxxxxx <br />
Rio de Janeiro/RJ - Brasil
</div>

<div style="height:1px;clear: both;margin-bottom: 15px;margin-top: 15px; border-top: 1px solid #FBC8A2;"></div>
Número do Pedido: <strong>${order.number}</strong>

<div>Obrigado pela compra. Este é o e-mail de confirmação de sua compra, efetuada na loja online.</div>


<div style="float:left">
Compra efetuada em nome de: <strong>${order.clientName}</strong>
</div>
<div style="float:right">Data da Compra: <strong>${order.ordered}</strong></div>


<div style="height:1px;clear: both;margin-bottom: 15px;margin-top: 15px; border-top: 1px solid #FBC8A2;"></div>

<div>
<strong>Dados do Pedido</strong>
<p>
<strong>Endereço de Entrega:</strong> ${order.shippStreet} ${order.shippNumber} / ${order.shippComplement}<br />
${order.shippSuburb} - ${order.shippCity} - ${order.shippState}
CEP: ${order.shippZip} - ${order.shippCountry}
</p>
<table width="100%" border="1" cellspacing="0" cellpadding="0" bordercolor="#FBC8A2">
<tr>
<td><strong>Produto</strong></td>
<td><strong>Quantidade</strong></td>
<td><strong>Preço Unitário</strong></td>
<td><strong>Preço Total</strong></td>
</tr>
<% order.orderItems.each { %>
<tr>
<td>${it.name}</td>
<td>${it.quantity}</td>
<td>${it.price}</td>
<td>${it.price * it.quantity}</td>
</tr>
<% } %>
</table>
<p>
<strong>Sub-total:</strong> ${order.subTotal}
<strong><br />
Valor do Frete:</strong> ${order.shippingCost}
<strong><br />
Total do Pedido:</strong> ${order.subTotal + order.shippingCost} </p>
</div>


</body>



Perceba que há o uso do GString (quando usamos ${order.algumaCoisa} ), e o uso de scriptlets <= algum groovy script >. Isso torna o nosso template totalmente dinâmico para fazermos o que bem ententer em termos de formatação.

Como a variável order chegou até o template para ser processada? Veremos a seguir:

Crie o Controller

seu controlador terá uma action como (o exemplo abaixo está simplificado, sem tratamento de erros do processamento):


def orderProcessed = {
def order = orderService.processOrder(params)
if(order) sendNotificationEmail(order)
}

private sendNotificationEmail(Orderr order){
File tplFile = grailsAttributes.getApplicationContext().getResource( File.separator + "WEB-INF" + File.separator + "orderNotification.gtpl").getFile();
def binding = ["order": order]
def engine = new SimpleTemplateEngine()
def template = engine.createTemplate(tplFile).make(binding)
def body = template.toString()


def email = [
to: [ "felipenasc@gmail.com" ], // "to" expects a List, NOT a single email address
subject: "Pedido realizado pelo site",
text: body
]
emailerService.sendEmail(email)
}


Aqui, pode-se ver o uso do Spring, integrado ao Grails. Primeiro eu usei o getResource() para ter facilmente um File com meu arquivo de template. Depois, eu processo o template com SimpleTemplateEngine de groovy. Em seguida monto um mapa com os dados do meu email e passo para o serviço de envio de email, que veremos a seguir.



Crie o Serviço de Envio de Email

O serviço é auto explicativo e eu coloco na íntegra abaixo:


import org.apache.log4j.Logger;
import org.springframework.mail.MailException
import org.springframework.mail.MailSender
import org.springframework.mail.MailMessage
import org.springframework.mail.javamail.MimeMessageHelper
import org.springframework.mail.javamail.MimeMessagePreparator
import javax.mail.internet.MimeMessage

/**
* Simple service for sending emails.
*
*/
class EmailerService {
boolean transactional = false
MailSender mailSender
Logger log = Logger.getLogger(this.class.name)

def sendEmail(mail) {

MimeMessage mimeMessage = mailSender.createMimeMessage()
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "ISO-8859-1");
helper.setFrom("seuemail@seila.com.br");
helper.setTo(mail.to);
helper.setSubject(mail.subject);
helper.setText(mail.text, true);

try {
log.info("about to send messages to:\n${mail.to}")
mailSender.send(mimeMessage)
} catch (MailException ex) {
log.error("Failed to send emails", ex)
}
}
}




Mais um exemplo simples e poderoso do Grails, se integrando com o Spring. Opa....faltou a confirguracao do spring.

Configure o seu bean de Mailer do Spring:
Na raiz do seu projeto/spring/resources.xml, adicione:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host">
<value>smtp.moebius.com.br</value>
</property>
</bean>


Abcs e até a próxima.

0 comentários: