sexta-feira, 26 de agosto de 2011

Enviar e-mail com anexo em Java usando o gmail.

Olá Pessoal,

Depois de um longo periodo sem postar, neste post, vou mostrar como mandar email com anexo em java, e para testar o nosso envio de email, vamos usar o gmail. Neste exemplo será usado a API javax.mail, teremos apenas uma classe que irá mandar uma imagem em anexo usando o protocolo do gmail.
No final do post, o projeto estará disponível para download.

package com.blogspot.jabesfelipe.email;

import java.io.InputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

/**
* Classe para enviar email em anexo usando o Gmail.
*
* @author jabes.cunha
*
*/
public class EnviaEmail {
public static void main(String[] args) {
new EnviaEmail().enviar();
}

public void enviar() {
try {

//usuario e senha do seu gmail
final String usuario = "jabesfelipe@gmail.com";
final String senha = "mandioca";

//config. do gmail
Properties mailProps = new Properties();
mailProps.put("mail.transport.protocol", "smtp");
mailProps.put("mail.smtp.starttls.enable","true");
mailProps.put("mail.smtp.host", "smtp.gmail.com");
mailProps.put("mail.smtp.auth", "true");
mailProps.put("mail.smtp.user", usuario);
mailProps.put("mail.debug", "true");
mailProps.put("mail.smtp.port", "465");
mailProps.put("mail.smtp.socketFactory.port", "465");
mailProps.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
mailProps.put("mail.smtp.socketFactory.fallback", "false");

//eh necessario autenticar
Session mailSession = Session.getInstance(mailProps, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(usuario, senha);
}
});
mailSession.setDebug(false);

//config. da mensagem
Message mailMessage = new MimeMessage(mailSession);

//remetente
mailMessage.setFrom(new InternetAddress(usuario));

//destinatario
mailMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(usuario));

//mensagem que vai no corpo do email
MimeBodyPart mbpMensagem = new MimeBodyPart();
mbpMensagem.setText("Segue em anexo, imagem do novo focus hath.");

//partes do email
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbpMensagem);
//imagem que sera enviada em anexo, ta no mesmo diretorio da classe.
String imagem = "focusHath2011.jpg";
InputStream is = getClass().getResourceAsStream(imagem);

//setando o anexo
MimeBodyPart mbpAnexo = new MimeBodyPart();
mbpAnexo.setDataHandler(new DataHandler(new ByteArrayDataSource(is, "application/image")));
mbpAnexo.setFileName(imagem);
mp.addBodyPart(mbpAnexo);

//assunto do email
mailMessage.setSubject("Novo Focus Hath 2011");
//seleciona o conteudo
mailMessage.setContent(mp);

//envia o email
Transport.send(mailMessage);
} catch (Exception e) {
e.printStackTrace();
}
}
}
EnviaEmail.java

A classe, está documentada, explicando os passos a passos, o e-mail que será enviado, ficará conforme imagem abaixo:

Para quem quiser baixar o projeto desenvolvido, clique aqui.
Qualque dúvida, crítica ou sugestão, fico à disposição.

10 comentários:

Marcos disse...

Olá Jabes Felipe meu nome é Marcos e estou fazendo aqui minha aplicação tmb com JMail eme deparei com o seu poste muito bom, e melhor ainda funciona, pois tem muita coisa na net q não funciona. Enfim, mas como eu posso anexar uma imagem da minha escolha com JFileChooser? Eu consigo pegar o caminho absoluto da imagem e jogar em um JTextFild ou JLabel, mas a imagem não vai. O bom e o certo era poder anexar qualquer imagem e arquivo de qualquer lugar do computador, vc sabe como ficaria isso nessa aplicação? A minha aplicação ta aqui no 4shared tmb http://www.4shared.com/file/qrgE7LFq/gmail_desktop.html com o titulo de Gmail Desktop.

Jabes Felipe disse...

Olá Marcos, respondi essa dúvida por email!

Marcos disse...

Jabes muito obrigado pela atenção.... Eu vi o email valeu, qualquer coisa se eu puder ajudar tmb só falar...ok?

PhilipeTL disse...
Este comentário foi removido pelo autor.
PhilipeTL disse...

Olá Jabes, programo um pouquinho de java e refiz exatamente o que postou e tive problemas

Segue:
javax.mail.AuthenticationFailedException: failed to connect, no password specified?
at javax.mail.Service.connect(Service.java:329)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at sendemail.SendEmail.send(SendEmail.java:99)
at sendemail.SendEmail.main(SendEmail.java:112)

Ele parou exatamente na linha do Transport.send(mailMessage);
gera uma exception

Sabe o que possa ser?

Desde já agradeço

Jabes Felipe disse...

Ok Philipe, vi seu e-mail, que bom que conseguir resolver!!!

Unknown disse...

Olá Jabes, agradeço sua colaboração postando esse código, precisei pesquisar por referencias e me ajudou bastante, excelente trabalho meu amigo - Parabéns...

Unknown disse...

Seria interessante que respondesse para todos, pois a dúvida de uma pessoa pode ser a de outras.

Unknown disse...

Bom dia Jabes Felipe, tenho a mesma duvida que o Marcos será que poderia me auxiliar?

Como eu posso anexar uma imagem da minha escolha com JFileChooser? Eu consigo pegar o caminho absoluto da imagem e jogar em um JTextFild ou JLabel, mas a imagem não vai. O bom e o certo era poder anexar qualquer imagem e arquivo de qualquer lugar do computador

@observador disse...

poderia me enviar esse código por email? não estou conseguindo baixar.

email: receberemail02@gmail.com

Postar um comentário

Jabes Felipe RSS Feed Jabes Felipe