A Apache fornece a API Commons-Email com o objetivo de tornar simples para os desenvolvedores Java a tarefa de enviar e-mails com textos puros, em formato HTML e com anexos. Usando como base a API JavaMail da Sun, são fornecidas as seguintes classes:
SimpleEmail – Classe usada para enviar e-mails de texto simples. Não permite anexos.
HtmlEmail – Classe usada para enviar emails formatados como HTML. Permite arquivos no corpo ou anexados.
MultiPartEmail – Classe usada enviar mensagens multipart. Permite arquivos no corpo ou anexados.
EmailAttachment – Classe usada para criar os anexos de uma mensagem. Utilizada com instâncias de HtmlEmail ou MultiPartEmail.
EmailException – Exceção gerada em caso de algum erro no envio de mensagem.
Para demonstrar a utilização da API, implementei uma aplicação que envia email com arquivo pdf anexado de uma conta do yahoo para uma conta do gmail.
Adicionando Commons-Email na Aplicação
Primeiramente é necessário o download das bibliotecas commons-email e java-mail. Depois de descompactados os arquivos baixados, os respectivos arquivos commons-email-1.2.jar e mail.jar devem ser adicionados ao classpath da aplicação. A imagem abaixo mostra como ficou a estrutura da aplicação no eclipse:

No diretório anexos se encontra o arquivo “postCommonsEmail.pdf” que será enviado anexado a mensagem de email.
Definindo Email do Rementente e Servidor SMTP
Com o classpath atualizado, a classe EnvioMensagemEmail pode ser implementada como mostra o código fonte. Um objeto estático da classe HtmlEmail é instanciado no método configurarParamentrosEnvio e as propriedades do email rementente e do seu respectivo servidor SMTP são definidas de acordo com os parametros recebidos. O SMTP do yahoo (smtp.yahoo.com.br) usa a porta 465 e necessita habilitar os protocolos SSL e TLS.
import org.apache.commons.mail.EmailAttachment; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.HtmlEmail; import java.io.File; /** * @author Bruno Garcia * @since 11/01/2010 */ public class EnvioMensagemEmail { /** * Objeto da classe HtmlEmail envia emails formatados como HTML. */ private static HtmlEmail email; /** * Define conta de email e servidor SMTP do remetente * * @param nomeServidorSmtp * Endereço do servidor SMTP da conta de email * @param emailRemetente * Endereço da conta de email do remetente * @param senhaRementente * Senha da conta de email do remetente * @throws EmailException */ private static void configurarParametrosEnvio( String nomeServidorSmtp, String nomeRemetente, String emailRemetente, String senhaRementente) throws EmailException { email = new HtmlEmail(); email.setSSL(true); email.setTLS(true); email.setSmtpPort(465); email.setHostName(nomeServidorSmtp); email.setAuthentication(emailRemetente, senhaRementente); email.setFrom(emailRemetente, nomeRemetente); }
Anexando Arquivo e Enviando Mensagem
O método anexarArquivoMensagem cria um objeto da classe EmailAttachment, define o diretório e nome do arquivo de acordo com os paramêtros recebidos e anexa a mensagem usando o método attach de HtmlEmail.
O método enviarMensagemHtml define o destinatário, assunto e corpo da mensagem e a envia através do método send de HtmlEmail.
/** * Anexa arquivo a mensagem de email a ser enviada * * @param diretorioAnexo * Diretório do arquivo a ser anexado * @param nomeArquivo * Nome com extensão do arquivo a ser anexado * @throws EmailException */ private static void anexarArquivoMensagem(String diretorioAnexo, String nomeArquivo) throws EmailException { EmailAttachment anexo = new EmailAttachment(); anexo.setPath(diretorioAnexo + File.separator + nomeArquivo); anexo.setDisposition(EmailAttachment.ATTACHMENT); anexo.setName(nomeArquivo); email.attach(anexo); } /** * Envia mensagem para email passado como paramêtro * * @param emailDestinatario * Endereço da conta de email do destinatario * @throws EmailException */ private static void enviarMensagemHtml(String emailDestinatario) throws EmailException { email.addTo(emailDestinatario); email.setSubject("[Blog] Post sobre API Commons-Email"); email.setHtmlMsg("Segue em anexo o arquivo pdf do post " + " sobre API <b>Commons-Email</b> da Apache. "); email.send(); }
Executando Aplicação e Verificando Email Recebido
No método main da classe, são executadas as funções passando como paramêtros os dados do email remetente, do arquivo a ser anexado e do email destinatário.
public static void main(String[] args) { try { configurarParametrosEnvio("smtp.mail.yahoo.com.br", "Bruno Garcia", "brunogarciavasconcelos@yahoo.com.br", "senha"); anexarArquivoMensagem("anexos", "postCommonsEmail.pdf"); enviarMensagemHtml("brunogarvas@gmail.com"); System.out.println("Email enviado com sucesso!"); } catch (EmailException e) { System.err.println(e.getMessage()); } } } // final da classe
Depois de implementada a classe, executamos a mesma como “Aplicação Java” no Eclipse e visualizamos a mensagem “Email enviado como sucesso!” no console. Acessando o gmail, visualizo o email recebido (clique na imagem para ampliar):

Conclusão
Esta API permite enviar e-mails utilizando poucas linhas de código e fornece métodos intuitivos para os desenvolvedores. Também apresenta facil configuração, necessitando adicionar somente um arquivo jar a aplicação.
Downloads:
http://commons.apache.org/downloads/download_email.cgi
http://java.sun.com/products/javamail/downloads/index.html
Ótimo post.
Os pontos mais positivos da API Commons-Email estão na facilidade de criar e enviar mensagens em diversos formatos (TXT Puro, HTML, Anexo(s/n)).
CurtirCurtir
Show de bola, Bruno. Eu já tinha estudado essa API anteriormente e o melhor do seu post é que você facilitou bastante a compreensão da utilização da biblioteca.
CurtirCurtir
[…] The busiest day of the year was 13 de janeiro with 103 views. The most popular post that day was Envio de Email com API Commons da Apache. […]
CurtirCurtir
Valeu funcionou perfeitamente….
CurtirCurtir
Precisava de enviar mais de um anexo ao email alguém já vez ou sabe como fazer….
CurtirCurtir