Enviando e-mail em Java com API Commons Email (SimpleEmail)
Se você já tentou enviar um e-mail utilizando a API JavaMail diretamente sabe que é um pouquinho complicado, principalmente quando você está apenas querendo mandar um e-mail simples, de notificação por exemplo. Então para facilitar este trabalho existe uma API que simplifica esta atividade a Commons Email da Apache que é construída em cima da API do JavaMail.
Basicamente ela fornece as seguintes classes para trabalharmos:
- SimpleEmail – Esta classe é sada para enviar e-mails como texto plano
- HtmlEmail – Esta classe é usada para enviar e-mails no formato HTML. Ela permite inserir anexo anexos na mensagem e suporta imagens incorporadas
- EmailAttachment – Esta classe é um simples contêiner que permite lidar com anexos de forma simples.
Para começar a utilizar devemos baixar as bibliotecas Commons Email e JavaMail e os insira no classpath.
Agora o código para enviar um e-mail sem formatação
SimpleEmail email = new SimpleEmail();
email.setSSLOnConnect(true);
email.setHostName( "smtp.seudominio.com.br" );
email.setSslSmtpPort( "465" );
email.setAuthenticator( new DefaultAuthenticator( "rodrigo@seudominio.com.br" , "1234" ) );
try {
email.setFrom( "rodrigo@seudominio.com.br");
email.setDebug(true);
email.setSubject( "Assunto do E-mail" );
email.setMsg( "Texto sem formatação" );
email.addTo( "rodrigoaramburu@gmail.com" );//por favor trocar antes de testar!!!!
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
Na linha 1 criamos um objeto SimpleEmail
que será utilizado para enviar a mensagem. Na linha 2 chamamos o método setSSLOnConnect
passando o parâmetro true, para fazer nossa mensagem ser enviada por uma conexão SSL já que a maior parte dos servidores exige, se seu servidor de e-mail não utiliza SSL esta linha não é necessário.
Na linha 3 configuramos o endereço do servidor de e-mails.
Na linha 4 configuramos a porta do servidor de e-mails, se estivermos utilizando SSL devemos configurar utilizando o método setSslSmtpPort
que recebe o número da porta como String, mas se não estivermos chamamos o método setSmtpPort
que recebe um inteiro como parâmetro.
Na linha 5 criamos um objeto DefaultAuthenticator
configurando o usuário e senha para autenticação de seu servidor de e-mail e adicionamos ele no objeto SimpleEmail
.
Na linha 7 configuramos o endereço de envio. Podemos também chamar este método com dois parâmetros sendo o primeiro o endereço de e-mail e o segundo o nome de quem está enviando a mensagem.
Na linha 9 configuramos para mostrar informações de debug na saída padrão, que ajuda bastante quando o no desenvolvimento.
Na linha 11 adicionamos o assunto de da mensagem, na linha 12 adicionamos a mensagem do e-mail.
Na linha 13 adicionamos o destinatário da mensagem.
Na linha 15 é chamado o método send()
que efetivamente enviará o e-mail.
HtmlEmail
Agora vamos mandar um e-mail formatado com HTML, para isso basicamente criamos um objeto HtmlEmail
em vez do SimpleEmail
e no texto da mensagem podemos colocar tags que serão interpretadas.
HtmlEmail email = new HtmlEmail();
email.setSSLOnConnect(true);
email.setHostName( "smtp.seudominio.com.br" );
email.setSslSmtpPort( "465" );
email.setAuthenticator( new DefaultAuthenticator( "rodrigo@seudominio.com.br" , "1234" ) );
try {
email.setFrom( "rodrigo@seudominio.com.br" , "Rodrigo Aramburu");
email.setDebug(true);
email.setSubject( "Assunto do E-mail" );
StringBuilder builder = new StringBuilder();
builder.append("<h1>Um titulo</h1>");
builder.append("<p>Lorem ipsum dolor sit amet, <b>consectetur adipiscing elit</b>. Duis nec aliquam tortor. Sed dignissim dolor ac est consequat egestas. Praesent adipiscing dolor in consectetur fringilla.</p>");
builder.append("<a href=\"http://wwww.botecodigital.info\">Boteco Digital</a> <br> ");
builder.append("<img src=\"http://www.botecodigital.info/wp-content/themes/boteco/img/logo.png\">");
email.setHtmlMsg( builder.toString() );
email.addTo( "rodrigoaramburu@gmail.com" );
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
Anexo
Para enviar um arquivo anexo junto com nosso e-mail basta adicioná-lo a mensagem.
HtmlEmail email = new HtmlEmail();
email.setSSLOnConnect(true);
email.setHostName( "smtp.seudominio.com.br" );
email.setSslSmtpPort( "465" );
email.setAuthenticator( new DefaultAuthenticator( "rodrigo@seudominio.com.br" , "1234" ) );
try {
email.setFrom( "rodrigo@seudominio.com.br" , "Rodrigo Aramburu");
email.setDebug(true);
email.setSubject( "Assunto do E-mail" );
EmailAttachment anexo = new EmailAttachment();
anexo.setPath("boteco.pdf");
anexo.setDisposition(EmailAttachment.ATTACHMENT);
anexo.setName("boteco.pdf");
email.attach(anexo);
email.setHtmlMsg( "Segue anexo" );
email.addTo( "rodrigo@botecodigital.info" );
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
Na linha 11 criamos um objeto EmailAttachment
que representa o arquivo a ser anexado, na linha 12 configuramos o caminho do arquivo que deve ser o caminho do arquivo no seu sistema de arquivo, podemos utilizar o caminho relativo ou absoluto.
Na linha 13 configuramos o “Content-disposition” no cabeçalho para ATTACHMENT
.
Na linha 14 podemos definir um nome para o arquivo, podendo ser diferente do nome original.
Na linha 16 adicionamos o objeto EmailAttachment
criado e configurado para o objeto da mensagem e seguimos os códigos normais para enviar como fizemos anteriormente.
Imagem incorporada
Vamos ver agora como colocar uma imagem incorporada no texto da mensagem.
HtmlEmail email = new HtmlEmail();
email.setSSLOnConnect(true);
email.setHostName( "smtp.seudominio.com.br" );
email.setSslSmtpPort( "465" );
email.setAuthenticator( new DefaultAuthenticator( "rodrigo@seudominio.com.br" , "1234" ) );
try {
email.setFrom( "rodrigo@seudominio.com.br" , "Rodrigo Aramburu");
email.setDebug(true);
email.setSubject( "Assunto do E-mail" );
String id = email.embed( new File("imagem1.png") );
String mensagem = "Segue uma imagem <img src=\"cid:"+id+"\"> fim da imagem";
email.setHtmlMsg( mensagem );
email.addTo( "rodrigo@botecodigital.info" );
email.send();
} catch (EmailException e) {
e.printStackTrace();
}
Basicamente a única diferença é na linha 11 onde chamamos o método embed
que recebe como parâmetro um objeto File
que será anexado ao e-mail e retornará um identificador String que iremos utilizar para inserir este arquivo no corpo da mensagem.
Na linha 13 inserimos o arquivo anexado anteriormente no corpo da mensagem através da tag img
colocando em seu atributo src
o cid
que que indica que queremos utilizar um arquivo incorporado que terá o identificador que segue após os “:”.
Como sei que irão perguntar, segue as configurações para o GMail, mas não esqueça que o GMail limita a quantidade de e-mails enviados em um dia.
email.setHostName( "smtp.gmail.com" );
email.setSslSmtpPort( "465" );
email.setStartTLSRequired(true);
email.setSSLOnConnect(true);
Bom era isso! T+ !