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