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