Introdução
Depois do post "JavaMail: Enviando e-mail com Java", que apresentava como enviar um e-mail com Java, resolvi complementar a assunto apresentando como enviar uma mensagem formatada, em HTML, e também como realizar o envio de anexos.
Bibliotecas
Além da biblioteca JavaMail, veja mais no post anterior, é necessário incluir o JavaBeans Activation Framework (JAF), apenas se a versão utilizada for anterior ao JSE 6.0, que já tem o JAF incluso.
O JAF está disponível em http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html, e neste download encontramos, alguns exemplos na pasta
Exemplo
Primeiramente devemos realizar a configuração da
Agora vamos montar uma mensagem HTML em uma String:
No nosso exemplo a segunda parte da
MailSenderPlus.java
Segue o código completo da classe que envia um e-mail com mensagem formatada e anexo.
E para finalizar me repito, afinal nunca é demais alertar, não use para enviar uma grande quantidade de mensagens em um curto de período de tempo, pois seu endereço, domínio ou IP podem cair em uma balcklist, e seus e-mails serem classificados como SPAM.
Até mais!
Marcelo de Castro
http://blog.castro.eti.br
http://twitter.com/mcastroinfo
http://www.globalcode.com.br/instrutores/MarceloCastro
Outros posts: http://blog.globalcode.com.br/search/label/MarceloCastro
Depois do post "JavaMail: Enviando e-mail com Java", que apresentava como enviar um e-mail com Java, resolvi complementar a assunto apresentando como enviar uma mensagem formatada, em HTML, e também como realizar o envio de anexos.
Bibliotecas
Além da biblioteca JavaMail, veja mais no post anterior, é necessário incluir o JavaBeans Activation Framework (JAF), apenas se a versão utilizada for anterior ao JSE 6.0, que já tem o JAF incluso.
O JAF está disponível em http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html, e neste download encontramos, alguns exemplos na pasta
 demo, documentação, incluindo javadocs, na pasta docs e a biblioteca activation.jar, que deve ser acrescentada no classpath da aplicação para versões anteriores ao JSE 6.0.Exemplo
Primeiramente devemos realizar a configuração da
javax.mail.Session e da javax.mail.internet.MimeMessage, estes passos podem ser vistos no post anterior.Agora vamos montar uma mensagem HTML em uma String:
String htmlMessage = "< h t m l > Código HTML da mensagem </ h t m l >";Para configurarmos a mensagem com os anexos (partes da mensagem), precisamos utilizar um objeto
javax.mail.internet.MimeMultipart, que será formado por várias partes (javax.mail.internet.MimeBodyPart) e para tanto vamos instanciá-lo conforme segue:Multipart multipart = new MimeMultipart();A primeira parte da
MimeMultipart, será a mensagem em HTML, então vamos criar e configurar um objeto javax.mail.internet.MimeBodyPart que representa uma parte da mensagem e adicioná-lo ao multipart:MimeBodyPart attachment0 = new MimeBodyPart(); attachment0.setContent(htmlMessage,"text/html; charset=UTF-8"); multipart.addBodyPart(attachment0);Observe que utilizamos o método
setContent passando a String com a mensagem HTML e outra passando o mime type da mensagem "text/html; charset=UTF-8".No nosso exemplo a segunda parte da
MimeMultipart, será uma imagem, então criaremos um java.io.File referenciando o arquivo desejado.String pathname = "duke.png";//pode conter o caminho File file = new File(pathname);Então criaremos mais um
 MimeBodyPart  para a imagem que será anexada, para tanto faremos uso das classes  javax.activation.FileDataSource  e  javax.activation.DataHandler do JAF, que realizarão o trabalho pesado de leitura, descoberta e configuração do tipo do arquivo, para inclusão do anexo.MimeBodyPart attachment1 = new MimeBodyPart(); attachment1.setDataHandler(new DataHandler(new FileDataSource(file))); attachment1.setFileName(file.getName()); multipart.addBodyPart(attachment1);Vale observar que o nome do anexo não precisa ser necessariamente o mesmo do arquivo, visto que, conforme apresentado no código anterior, esta configuração é feita por meio do método
setName, então para configurar com outro nome qualquer, bastaria utilizar o referido método da seguinte forma:attachment1.setFileName("outroNomeQualquer.png");Então, após adicionar todas as partes desejadas na  javax.mail.internet.MimeMultipart , por meio do método addBodyPart basta adicioná-la como conteúdo da javax.mail.internet.MimeMessage e então efetivamente enviar a mensagem, como pode ser visto no trecho de código abaixo:message.setContent(multipart); Transport.send(message);
MailSenderPlus.java
Segue o código completo da classe que envia um e-mail com mensagem formatada e anexo.
package br.eti.castro.blog.samples.email;
//imports omitidos
public class MailSenderPlus {
 //o tratamento de excessoes foi simplificado (throws MessagingException)
 //para facilitar o entendimento do exemplo
 public static void main(String[] args) throws MessagingException{
  //objeto para definicao das propriedades de configuracao do provider
  Properties props = new Properties();
  //o valor "smtp.host.com.br" deve ser alterado para o seu servidor SMTP
  props.put("mail.host","smtp.host.com.br"); 
  //obtendo um Session com a configuração 
  //do servidor SMTP definida em props
  Session session = Session.getDefaultInstance(props);
  
  //criando a mensagem
  MimeMessage message = new MimeMessage(session);
  //substituir pelos e-mails desejados
  Address from = new InternetAddress("remetente@host.com");
  Address to = new InternetAddress("destinatario@host.com");
  //configurando o remetente e o destinatario
  message.setFrom(from);
  message.addRecipient(RecipientType.TO, to);
   //configurando a data de envio,  o assunto e o texto da mensagem
  message.setSentDate(new Date());
  message.setSubject("Enviando uma mensagem formatada com anexo");
  
  // conteudo html que sera atribuido a mensagem
  String htmlMessage = "< h t m l > Código HTML da mensagem ";
  //criando a Multipart
  Multipart multipart = new MimeMultipart();
  //criando a primeira parte da mensagem
  MimeBodyPart attachment0 = new MimeBodyPart();
  //configurando o htmlMessage com o mime type
  attachment0.setContent(htmlMessage,"text/html; charset=UTF-8");
  //adicionando na multipart
  multipart.addBodyPart(attachment0);
  
  //arquivo que será anexado
  String pathname = "duke.png";//pode conter o caminho
  File file = new File(pathname);
  //criando a segunda parte da mensagem
  MimeBodyPart attachment1 = new MimeBodyPart();  
  //configurando o DataHandler para o arquivo desejado
  //a leitura dos bytes, descoberta e configuracao do tipo
  //do arquivo serão resolvidos pelo JAF (DataHandler e FileDataSource)
  attachment1.setDataHandler(new DataHandler(new FileDataSource(file)));
  //configurando o nome do arquivo que pode ser diferente do arquivo
  //original Ex: setFileName("outroNome.png")
  attachment1.setFileName(file.getName());
  //adicionando o anexo na multipart
  multipart.addBodyPart(attachment1);
  //adicionando a multipart como conteudo da mensagem 
  message.setContent(multipart);
  
  //enviando
  Transport.send(message);
  
  System.out.println("E-mail enviado com sucesso!");
 }
}
E para finalizar me repito, afinal nunca é demais alertar, não use para enviar uma grande quantidade de mensagens em um curto de período de tempo, pois seu endereço, domínio ou IP podem cair em uma balcklist, e seus e-mails serem classificados como SPAM.
Até mais!
Marcelo de Castro
http://blog.castro.eti.br
http://twitter.com/mcastroinfo
http://www.globalcode.com.br/instrutores/MarceloCastro
Outros posts: http://blog.globalcode.com.br/search/label/MarceloCastro
 
Comentários
Teria algum exemplo que nãoocorre isso?
Para incluir outro anexo, basta repetir o trecho que cria um novo MimeBodyPart e adiciona ao objeto multipart.
[]s
Ana
java.lang.NoClassDefFoundError: com/sun/mail/util/PropUtil