Spring Framework 3 Configurando o Serviço JavaMail
No artigo anterior, Spring 3 – 100% Livre de XML, foi demonstrado um exemplo de configuração dos beans do Spring sem a necessidade do uso de arquivos de configuração por XML. Desta vez, seguindo a mesma linha, será abordada a configuração do serviço de email fornecido pelo Spring através da biblioteca JavaMail. Vamos trabalhar com envio de mensagem no formato HTML, com lista de anexos e também veremos como inserir uma imagem no corpo da mensagem.
1. Preparando o projeto
Para o exemplo deste tutorial será necessário o uso das seguintes bibliotecas:
- Spring – Latest GA release: 3.1.2.RELEASE: http://www.springsource.org/download/community.
- Apache Commons (1.1.1): http://commons.apache.org/logging/download_logging.cgi
- CGLIB 2.2.3: http://sourceforge.net/projects/cglib/files/
- JavaMail 1.4.5: http://www.oracle.com/technetwork/java/javamail/index-138643.html
2. Iniciando o projeto
Crie um projeto na sua IDE de preferência e adicione as bibliotecas citadas. Feito isso, vamos criar a classe MyMessage
, a qual terá alguns atributos e métodos que irão armazenar as informações dos emails que serão enviados. Alguns destes atributos são: o corpo da mensagem, lista de anexos, assunto da mensagem, lista de destinatários, entre outras.
package com.wp.mb.tutorial.entity; import java.util.ArrayList; import java.util.List; /** * http://www.mballem.com */ public class MyMessage { private String from; private String personal; private String text; private String subject; private Listattachments = new ArrayList (); private String[] users; private String[] fileBody = new String[2]; //gere os métodos get/set //adiciona uma imagem no corpo da mensagem public void addFileBody(String cid, String file) { this.fileBody[0] = cid; this.fileBody[1] = file; } //adicionar os anexos da mensagem public void addAttachment(String... files) { for (String file : files) { this.attachments.add(file); } } //adicionar os destinatarios da mensagem public void addUser(String... toUsers) { this.users = toUsers; } }
Em seguida vamos adicionar a classe JavaMailService
, a qual será responsavel pelo envio e por adicionar no objeto de envio os dados que formam a mensagem de email a ser enviada. Esta classe será também um bean gerenciado pelo Spring, o qual será configurado na classe BeanJavaMailSource
da Listagem 3.
package com.wp.mb.tutorial.service; import com.wp.mb.tutorial.entity.MyMessage; import org.springframework.core.io.FileSystemResource; import org.springframework.mail.MailException; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.util.Date; /** * http://www.mballem.com */ public class JavaMailService { //objeto responsavel por enviar a mensagem. private JavaMailSender javaMailSender; public JavaMailService(JavaMailSender javaMailSender) { this.javaMailSender = javaMailSender; } public void sendMail(MyMessage message) { //objeto que recebe os dados a serem enviados na mensagem. MimeMessage mimeMessage = javaMailSender.createMimeMessage(); //quando trabalhamos com anexos, devemos usar um objeto // do tipo MimeMessageHelper. MimeMessageHelper helper; try { //inicializamos o obejto helper. helper = new MimeMessageHelper(mimeMessage, true); //inserimos dados de quem está enviando a mensagem. helper.setFrom(message.getFrom(), message.getPersonal()); //inserimos os destinatarios helper.setTo(message.getUsers()); //inserimos a data de envio helper.setSentDate(new Date()); //inserimos o texto da mensagem, // o atributo true indica que será em html. helper.setText(message.getText(), true); //inserimos o assunto da mensagem. helper.setSubject(message.getSubject()); //inserimos uma imagem no corpo da mensagem. //o 1° parametro será o cid, id do anexo que será inserido. //o 2° parametro será a url onde o arquivo está armazenado em disco. helper.addInline( message.getFileBody()[0], new FileSystemResource(message.getFileBody()[1]) ); //inserimos os anexos adicionados a lista de anexos. // Fazemos um for() na lista para adicionar um anexo por vez. for (String anexo : message.getAttachments()) { File attach = new File(anexo); helper.addAttachment("Attachment: " + attach.getName(), attach); } //objeto de envio da mensagem. javaMailSender.send(mimeMessage); System.out.println("Envio com Sucesso!"); } catch (MailException e) { System.out.println("Email não pode ser eviado!\n" + e.getMessage()); } catch (MessagingException e) { System.out.println("Email não pode ser eviado.\n" + e.getMessage()); } catch (IOException e) { System.out.println("Anexo não encontrado\n" + e.getMessage()); } } }
Agora vamos configurar o bean do Spring responsável por gerenciar o objeto de envio, o JavaMailSenderImpl
. As configurações necessárias para a conexão com servidor de email serão adicionadas a um arquivo de propriedades, o qual será lido pelo Spring através do bean mailProperties
e adicionadas as variáveis de instancia configuradas com as anotações @Value
. O JavaMail trabalha com algumas configurações de propriedades, que neste caso serão inseridas no método mailProps()
e posteriormente adicionadas as configurações do bean javaMailSender
. No bean javaMailService
, adicionamos no parmetro do construtor da classe JavaMailService
, um objeto inicializado referente ao bean javaMailSender
.
package com.wp.mb.tutorial.configuration; import com.wp.mb.tutorial.service.JavaMailService; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.PropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PropertiesLoaderSupport; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; import java.util.Properties; /** * http://www.mballem.com */ @Configuration public class BeanJavaMailSource { @Value("#{props['mail.host']}") private String host; @Value("#{props['mail.port']}") private int port; @Value("#{props['mail.protocol']}") private String protocol; @Value("#{props['mail.encoding']}") private String encoding; @Value("#{props['mail.smtp.starttls.enable']}") private String starttls; @Value("#{props['mail.user']}") private String user; @Value("#{props['mail.pass']}") private String pass; @Bean(name = "javaMailSender") public JavaMailSender javaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost(host); mailSender.setPort(port); mailSender.setProtocol(protocol); mailSender.setUsername(user); mailSender.setPassword(pass); mailSender.setDefaultEncoding(encoding); mailSender.setJavaMailProperties(mailProps()); return mailSender; } @Bean(name = "javaMailService") public JavaMailService javaMailService() { return new JavaMailService(javaMailSender()); } @Bean(name = "props") public PropertiesLoaderSupport mailProperties() { PropertiesFactoryBean props = new PropertiesFactoryBean(); props.setLocation(new ClassPathResource("/mail.properties")); return props; } private Properties mailProps() { Properties properties = new Properties(); properties.setProperty("mail.smtp.starttls.enable", starttls); return properties; } }
O arquivo de propriedades, mail.properties
, deve ser adicionado dentro do diretório “src” do projeto, veja a seguir os dados que compõem o arquivo:
mail.host = smtp.gmail.com mail.port = 587 mail.protocol = smtp mail.encoding = ISO-8859-1 mail.smtp.starttls.enable = true mail.user = marcio@gmail.com mail.pass = minha_senha123
package com.wp.mb.tutorial; import com.wp.mb.tutorial.entity.MyMessage; import com.wp.mb.tutorial.service.JavaMailService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.core.io.Resource; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * http://www.mballem.com */ public class Teste { private JavaMailService mailService; private AnnotationConfigApplicationContext ctx; public Teste(JavaMailService mailService, AnnotationConfigApplicationContext ctx) { this.mailService = mailService; this.ctx = ctx; } public static void main(String[] args) { //inicializa o container do Spring. AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); //informa ao Spring onde ele deve procurar por classes anotadas ctx.scan("com.wp.mb.tutorial"); ctx.refresh(); Teste t = new Teste(ctx.getBean(JavaMailService.class), ctx); t.sendMail(); } //método onde serão informados os dados de envio. private void sendMail() { //podemos adicionar varios destinatarios. String to1 = "marcos@gmail.com"; String to2 = "joana@hotmail.com"; String to3 = "maria@bol.com.br"; //objeto para inserir os dados de envio MyMessage message = new MyMessage(); //informamos o assunto da mensagem message.setSubject("Teste Spring Mail"); //inserimos o corpo da mensagem, // neste caso um string com o html do arquivo mensagem.html message.setText(readFile()); //inserimos os destinatarios message.addUser(to1, to2, to3); //inserimos a imagem do corpo da mensagem message.addFileBody("0001", "C:\\spring.png"); //inserimos 2 anexos message.addAttachment("C:\\logo-mongodb.png", "C:\\duke.jpg"); //inserimos os dados do rementente que // serão exibidos na mensagem message.setFrom("marcio@gmail.com"); message.setPersonal("mballem.wordpress.com"); //chama o método de envio da classe JavaMailService. mailService.sendMail(message); } //método responsavel por ler o arquivo html. private String readFile() { Resource resource = ctx.getResource("classpath:/mensagem.html"); String html = ""; try { BufferedReader bufferedReader = new BufferedReader(new FileReader(resource.getFile())); String linha = ""; while ((linha = bufferedReader.readLine()) != null) { html = html + linha; } bufferedReader.close(); return html; } catch (IOException e) { e.printStackTrace(); } return null; } }
Veja a seguir o conteúdo do arquivo mensagem.html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html xmlns="http://www.w3.org/1999/html"> <head> <meta content="text/html" http-equiv="content-type"> <title>JavaMail com Spring Framework</title> </head> <body> <div id="_div"> <img src='cid:0001'><br> <b>JavaMail With Spring Framework</b><br> Trabalhando com JavaMail em conjunto com o Spring Framework 3 sem o uso de configuração por XML.<br> * download <a href="http://www.oracle.com/technetwork/java/javamail/index.html"> JavaMail </a> library.<br> * download <a href="http://www.springsource.org/download/community"> Spring Framework </a> library.<br> </div> </body> </html>
Crie esse arquivo no diretório src do seu projeto. Note que na tag adicionamos como atributo o códido
cid:0001
. é através deste código que podemos inserir uma imagem no corpo do email. Cada imagem inserida no corpo do email deverá possuir um código único.
Veja na Figura 1, a estrutura do projeto:
Confira na Figura 2 um exemplo de como o email enviado será recebido pelo destinatário. Veja que temos 3 imagens, onde 2 são enviadas como anexo e uma delas está adicionada ao corpo da mensagem de email, logo acima do texto da mensagem. Temos também o assunto do email: “Teste Spring Mail”, e logo abaixo do assunto, é possível visualizar os dados do remetente: “mballem.wordpress.com marcio@gmail.com”.
Saiba mais em:
- Spring Framework 3 – http://static.springsource.org/spring/docs/3.0.x/reference/
- Oracle Javamail – http://www.oracle.com/technetwork/java/javamail/index.html
- Tutorial Java Mail sem Spring – Enviando email com a API JavaMail
Até 2013!