Baixar anexos do email com JavaMail - [RESOLVIDO]

Boa tarde pessoal,

Estou fazendo uma aplicação na qual eu tenho que baixar os e-mails de um certo e-mail e junto com eles
toda as informações.
De:
Assunto:
Conteúdo:
Anexos: (Onde está meu problema).

minha aplicação tirando a parte do anexo está pronta, não consigo achar em lugar nenhum um, um material completo de
como poderei baixar os anexos do meu e-mail. O pessoal começa a postar e quando consegue resolver o problema não posta a solução. =/

Segue meu código:

package testeEmailReceive;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;

import software.mail.EmailAccount;

public class InboxReader {

	public static void main(String args[]) {

		Properties props = System.getProperties();
		props.setProperty("mail.store.protocol", "imaps");


		try {

			Session session = Session.getDefaultInstance(props, null);
			Store store = session.getStore("imaps");

			store.connect("imap.gmail.com", email, password);
			System.out.println(store);

			Folder inbox = store.getFolder("Inbox");
			inbox.open(Folder.READ_ONLY);
			Message messages[] = inbox.getMessages();
			for (Message message : messages) {
				printMessage(message);
			}

		} catch (NoSuchProviderException e) {
			e.printStackTrace();
			System.exit(1);
		} catch (MessagingException e) {
			e.printStackTrace();
			System.exit(2);
		}

	}

	/**
	 * "printMessage()" method to print a message.
	 */
	public static void printMessage(Message message) {
		try {
			// Get the header information
			String from = ((InternetAddress) message.getFrom()[0])
					.getPersonal();
			if (from == null)
				from = ((InternetAddress) message.getFrom()[0]).getAddress();

			System.out.println("FROM: " + from);
			String subject = message.getSubject();
			System.out.println("SUBJECT: " + subject);

			// -- Get the message part (i.e. the message itself) --
			Part messagePart = message;
			Object content = messagePart.getContent();

			// -- or its first body part if it is a multipart message --
			if (content instanceof Multipart) {
				messagePart = ((Multipart) content).getBodyPart(0);
				System.out.println("CONTEÚDO: "+messagePart.getContent().toString());
			}

			// -- Get the content type --
			String contentType = messagePart.getContentType();

			// -- If the content is plain text, we can print it --
			System.out.println("CONTENT:" + contentType);
			if (contentType.startsWith("text/plain") || contentType.startsWith("text/html")) {
				InputStream is = messagePart.getInputStream();

				BufferedReader reader = new BufferedReader(
						new InputStreamReader(is));

				String thisLine = reader.readLine();
				while (thisLine != null) {
					thisLine = reader.readLine();
				}
			}
			
			//baixar anexo:
			
			
			
			

			System.out.println("-----------------------------");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

}

Desde já agradeço!

1 curtida

Bom amigo, não sei se esta seria a melhor abordagem mas acredito que isto resolva seu problema.
coloca este trecho no lugar no //baixar anexo

else {
   byte[] buf = new byte[4096];

//Aqui você define o caminho que salvará o arquivo.
   String caminhoBase = System.getProperty("user.dir") + "/";
   Multipart multi = (Multipart) content;
  
 for (int i = 0; i < multi.getCount(); i++) {
     String nomeDoArquivo = multi.getBodyPart(i).getFileName();
     if (nomeDoArquivo != null) {
      InputStream is = multi.getBodyPart(i).getInputStream();
      FileOutputStream fos = new FileOutputStream(caminhoBase + nomeDoArquivo);
      int bytesRead;
      while ((bytesRead = is.read(buf)) != -1) {
         fos.write(buf, 0, bytesRead);
      }
     fos.close();
    }
  }
}

Espero ter ajudado. :smiley:
Abraço

1 curtida

Valeu Brother , funcionou…

mas você poderia me explicar o que quer dizer esse código?
Qual objeto é meu arquivo, ex: no caso de eu salvar esse arquivo em uma tabela do banco (do mesmo tipo claro)
qual é o Objeto que eu devo manipular…
eu não entendi o código… =/

Cara, de forma bem resumida, este código acha todos os arquivos que contenham o contentType diferente de text/plain e text/html e salva os mesmos em disco.
O objeto is do tipo InputStream é quem tem seu anexo, o que ta sendo feito no while ai é simplesmente ler os bytes deste anexo e salvar em um diretório na máquina.
O que vc pode fazer é ao invés salvar os bytes em disco direto, mandá-los para um objeto. Vale reforçar, como disse na mensagem anterior, não sei se esta é a melhor abordagem, fiz esse código a muito tempo atrás a título de aprendizado.

1 curtida

Perfeito cara,
Muito obrigado mesmo, serviu para o que eu queria e consegui entender completamente o código agora.

valeu mesmo…

Código Finalizado pra quem ficou com duvidas.

[code]package testeEmailReceive;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;

import software.mail.EmailAccount;

public class InboxReader {

public static void main(String args[]) {

	Properties props = System.getProperties();
	props.setProperty(&quot;mail.store.protocol&quot;, &quot;imaps&quot;);

	try {

		Session session = Session.getDefaultInstance(props, null);
		Store store = session.getStore(&quot;imaps&quot;);

		store.connect(&quot;imap.gmail.com&quot;, email ,
				password );
		System.out.println(store);

		Folder inbox = store.getFolder(&quot;Inbox&quot;);
		inbox.open(Folder.READ_ONLY);
		Message messages[] = inbox.getMessages();
		for (Message message : messages) {
			printMessage(message);
		}

	} catch (NoSuchProviderException e) {
		e.printStackTrace();
		System.exit(1);
	} catch (MessagingException e) {
		e.printStackTrace();
		System.exit(2);
	}

}

/**
 * &quot;printMessage()&quot; method to print a message.
 */
public static void printMessage(Message message) {
	try {
		// Get the header information
		String from = ((InternetAddress) message.getFrom()[0])
				.getPersonal();
		if (from == null)
			from = ((InternetAddress) message.getFrom()[0]).getAddress();

		System.out.println(&quot;FROM: &quot; + from);
		String subject = message.getSubject();
		System.out.println(&quot;SUBJECT: &quot; + subject);

		// -- Get the message part (i.e. the message itself) --
		Part messagePart = message;
		Object content = messagePart.getContent();

		// -- or its first body part if it is a multipart message --
		if (content instanceof Multipart) {
			messagePart = ((Multipart) content).getBodyPart(0);
			System.out.println(&quot;CONTEÚDO: &quot;
					+ messagePart.getContent().toString());
		}

		// -- Get the content type --
		String contentType = messagePart.getContentType();

		// -- If the content is plain text, we can print it --
		System.out.println(&quot;CONTENT:&quot; + contentType);
		if (contentType.startsWith(&quot;text/plain&quot;)
				|| contentType.startsWith(&quot;text/html&quot;)) {
			InputStream is = messagePart.getInputStream();

			BufferedReader reader = new BufferedReader(
					new InputStreamReader(is));

			String thisLine = reader.readLine();
			while (thisLine != null) {
				thisLine = reader.readLine();
			}
		}

	else {
			byte[] buf = new byte[4096];

			// Aqui você define o caminho que salvará o arquivo.
			String caminhoBase = System.getProperty(&quot;user.dir&quot;) +&quot;\\src\\testeEmailReceive\\&quot;;
			Multipart multi = (Multipart) content;

			
			
			for (int i = 0; i &lt; multi.getCount(); i++) {
				
				String nomeDoArquivo = multi.getBodyPart(i).getFileName();
				
				if (nomeDoArquivo != null) {
					
                                            //imprimindo o caminho já com o nome do arquivo para ter certeza, e somente se tiver arquivos.
					System.out.println(caminhoBase+nomeDoArquivo);
					
					InputStream is = multi.getBodyPart(i).getInputStream();
					
					FileOutputStream fos = new FileOutputStream(caminhoBase	+ nomeDoArquivo);
					
					int bytesRead;
					while ((bytesRead = is.read(buf)) != -1) {
						fos.write(buf, 0, bytesRead);
					}
					
					fos.close();
				}
			}
		}

		System.out.println(&quot;-----------------------------&quot;);
	} catch (Exception ex) {
		ex.printStackTrace();
	}
}

}
[/code]

1 curtida

Olá amigos, achei muito interessante o assunto de poder salvar o email e muito mais interessante ainda os anexos dele. Queria saber se isso se enquadraria e/ou se tem como fazer isso em uma aplicação web? Se sim, o código seria esse? Outra coisinha também que não entendi. Esse código foi feito para um email específico ou qualquer email funcionária? Desde já meu muito obrigado!

Com algumas alterações no código é possível sim fazer funcionar para outros e-mails. Cada provedor de e-mail tem suas configurações específicas de stmp, pop, imap, neste caso está sendo usado GMAIL.
No caso de utilizar em aplicação web minha resposta é a mesma, é possível desde que haja alteração no código.

Outra pergunta que esqueci e acho muito importante. Você consegue baixar um email específico ou só consegue trazer todos os emails? Outra… Conseguiria baixar um email da lixeira por exemplo? Achei muito interessante a ideia de manipular o email, e penso em acrescentar isso no workflow da minha empresa, na qual acho muito interessante.

pelo o que compreendi utilizando a API JavaMail, nós podemos especificar atraves desse código:

	Folder inbox = store.getFolder("Inbox");
	inbox.open(Folder.READ_ONLY);

onde queremos puxar…
mas não sei se é possivel pegar da lixeira, teria que dar uma olhada na especificação da API…

http://javamail.kenai.com/nonav/javadocs/index.html

:wink:

Beleza, muito obrigado, vou baixar a lib aqui e testar no gmail mesmo, se eu conseguir fazer funcionar no gmail vou testar com o email da empresa… Se eu obter algum resultado volto a dar notícias, e se eu tiver alguma dúvida também volto a dar notícias kkkk, Abraço, e obrigado novamente! :smiley:

demoro cara, posta ae qlqr coisa…

abraçoo!

augustovieira, de acordo com a API também é possível procurar e-mail específico de acordo com algum critério.

Se é mesmo possível buscar um email específico vai resolver 100% o que eu quero fazer! Show de bola!

Fiz o download porém estou perdido, vou ter que importar tudo que vem no zip pro meu projeto? achei que era só uma lib pra colocar no meu projeto.

é só pegar o jar do javamail e jogar no classpath…

o resto é arquvo pra ajudar vc…
demos e etc…

Esse é o problema, não estou encontrando esse jar nessa infinidade de pastas que veio junto. Sabe qual pasta está ou qual o nome dele? Se melhor cola ele aqui?

ta na primeira pasta brother…

o dentro da pasta que você baixou, ele chama MAIL.jar

:wink:

Infelizmente procurei nas pastas que fiz download e não tem nenhum jar. Única coisa que tem é um mail.sig

você baixou por aqui?

http://www.oracle.com/technetwork/java/javamail/index-138643.html

Esse foi o arquivo que baixei: javamail-1.4.5-src.zip. Foi exatamente ai que fiz o download, é esse não é?