quarta-feira, 14 de novembro de 2007

Enviando e-mail com os pés nas costas, em Java

Qualquer aplicação web que se de ao respeito, tem que enviar e-mail. Nem que seja só pra enviar o lembrete da senha ou uma 'recomentação' de visita para um amigo.
Nunca tive grandes dificuldades para fazer o envio de e-mails através do sistemas que desenvolvi, mas tinha que me deparar com Session, Transport, System.properties. Como era a única opção, encarava assim mesmo.

Mas depois que conheci o projeto Apache Commons Email (http://commons.apache.org/email/) tudo ficou mais fácil.

alias, convido a todos para conhecer os projeto do Apache Commons, existem coisas muito interessantes por lah, nos proximos posts foi abordar mais projetos do Commons.

Mas voltando ao e-mail, a facilidade e simplicidade que este projeto provê é muito grande. Veja um primeito exemplo de e-mail:

SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("Test message");
email.setMsg("This is a simple test of commons-email");
email.send()

Precisa autenticar no servidor?

email.setAuthentication("fulano", "teste123");

A porta do servidor não é a padrão?

email.setSmtpPort(25);

Quer enviar a mensagem como prioritária?

email.addHeader("X-Priority", "1");
email.addHeader("Priority", "Urgent");
email.addHeader("Importance", "high");

Quer anexar arquivo?

// Cria o e-mail preparado para os anexos
MultiPartEmail email = new MultiPartEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("The picture");
email.setMsg("Here is the picture you wanted");

// Cria o anexo
EmailAttachment attachment = new EmailAttachment();
attachment.setPath("mypictures/john.jpg");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Picture of John");
attachment.setName("John");

// Adiciona o anexo
email.attach(attachment);

// Envia o e-mail
email.send();
Anexar arquivo externo?

EmailAttachment attachment = new EmailAttachment();
attachment.setURL(new URL("http://www.apache.org/images/asf_logo_wide.gif"));
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Apache logo");
attachment.setName("Apache logo");
email.attach(attachment);
E-mail em HTML e com imagem incorporada?

// Cria a mensagem HTML
HtmlEmail email = new HtmlEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("Test email with inline image");

// incorpora a mensagem e obtem o cid (content ID)

URL url = new URL("file://c:\logos\logo.gif");
String cid = email.embed(url, "Apache logo");

// seta a mensagem em HTML
email.setHtmlMsg("<html>The apache logo - <img src='cid:"+ cid +"' /></html>");

// seta a mensagem correspondente sem HTML
email.setTextMsg("Your email client does not support HTML messages");
// envia o e-mail

email.send();
Se você quiser incorporar imagens locais, poderá passar no construtor do objeto URL o caminho precedido por (file://). Ex: file://c:\image.gif
Mas eu queria usar o Session do JavaMail para ter mais performance no envio de uma grande quantidade de e-mails!
Para isto utilize o método .email.setMailSession(session)
Para debuggar o funcionamento desta biblioteca, ative o DEBUG.
Para ativar o debug, utilize o método setDebug(boolean). Ex: email.setDebug(true)
Informações sobre o andamento interno do envio do e-mail serão impressas no console, via System.out.println()
Bibliotecas necessárias

Para utilizar o apache commons-mail, são necessários os jars abaixo:

Estes jars devem ser incluídos no classpath da sua aplicação, ou colocados em WEB-INF\lib se a sua aplicação for WEB.

Bons e-mails e abraços a todos!

4 comentários:

Fred disse...

Ufa! Ate que enfim achei um blog legal e que tem notícia que ajuda no javamail.
Putz! Se eu não autenticar não vai né...rs

valeu _o/

Diógenes Otimista de Souza disse...

Cara essa biblioteca é muito boa mesmo, sucesso no blog ae camarada!

Flávio Casas de Arcega

Anônimo disse...

//192.168.50.4/AxxQ/index.html

Anônimo disse...

E se minha url for //192.168.50.4/AXXQ/index.html