Salvar anexo pasta fixa Email com JavaMail

Pessoal, boa tarde.

Estou com uma aplicação que lê os emails de um determinado servidor. (gmail, hotmail, etc). Blza, até a leitura está tranquilo. Entretanto, estou com problemas para salvar o anexo que está na mensagem de email. Tenho uma aplicação que estou estudando aqui, tentei procurar o erro, mas não encontrei.

Quando executo a aplicação de exemplo, roda normalmente, sem erros, porém, os arquivos não são salvos na pasta fixa no computador.

Vou postar o projetinho:

package model;

public class Constantes {
	public static final String PASTA_XML = "c://xml//";
	public static final String IMAP = "pop3";
	//public static final String HOST = "pop3.uol.com.br";
	public static final String HOST = "pop.dzyon.com";
	public static final int PORTA = 110;
	public static final String ARQUIVO_MSG = "";

	public static final String LOGIN = "usuario";
	//
        public static final String SENHA = "senha";//
	public static final String PASTA_PRINCIPAL = "Inbox";
	public static final String PASTA_BACKUP = "Trash";
}

package model;

import java.io.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;

public class ReadEmails 
{
    private Store store = null;
    private Folder folder = null;
    private Message message = null;
    private Message[] messages = null;
    private Object msgObj = null;
    private String sender = null;
    private Multipart multipart = null;
    private Part part = null;
    private String contentType = null;

    public ReadEmails() throws MessagingException {
            processMail();
    }
    
    public void processMail() throws MessagingException {
            try {
                store = conexaoServidorEMail();
                folder = getPastaCaixaEntrada(store);
                messages = folder.getMessages();

                for (int messageNumber = 0; messageNumber < messages.length; messageNumber++) {
                        message = messages[messageNumber];
                        msgObj = message.getContent();

                        // Determine o tipo de email
                        if (msgObj instanceof Multipart) {

                                message.getSubject();
                                multipart = (Multipart) message.getContent();

                                for (int i = 0; i < multipart.getCount(); i++) {

                                        part = multipart.getBodyPart(i);
                                        // pegando um tipo do conteúdo
                                        contentType = part.getContentType();

                                        String fileName2 = part.getFileName();
                                        if (fileName2 != null) {
                                                System.out.println(messageNumber + " " + fileName2
                                                                + " | " + message.getSubject());
                                        }
                                        fileName2 = null;

                                        // Tela do conteúdo
                                        if (contentType.startsWith("text/plain")) 
                                        {
                                            
                                        }
                                        else {
                                                String fileName = part.getFileName();
                                                @SuppressWarnings("unused")
                                                Message[] mensagensXML = separaMensagensXML(i,
                                                                fileName);

                                        }
                                }
                        } else {
                                sender = ((InternetAddress) message.getFrom()[0])
                                                .getPersonal();
                                if (sender == null) {
                                        sender = ((InternetAddress) message.getFrom()[0])
                                                        .getAddress();
                                }
                                message.getSubject();
                        }
                }
                // Fecha a pasta
                folder.close(true);
                // Histório de mensagens
                store.close();
                System.out.println("Terminado");
        } catch (Exception e) {
                System.out.println(e.getMessage());
                store.close();
                e.printStackTrace();
        }
    }
    
    private Message[] separaMensagensXML(int i, String fileName)
			throws MessagingException, IOException {
        Message[] mensagensXML = folder.getMessages();
        if (fileName != null) {
                int tamanhoString = fileName.length() - 3;
                for (int a = 0; a < messages.length; a++) {
                        if (fileName.substring(tamanhoString).equals("xml")) {
                                mensagensXML[a] = message;
                        }
                }
        }
        // Recebendo o nome do arquivo
        @SuppressWarnings("unused")
        String fileName2 = validarXML(part, store, folder, mensagensXML, i);
        return mensagensXML;
    }
    
    private void excluirMensagemInbox(Message[] messages, int i)
                    throws MessagingException {
        @SuppressWarnings("unused")
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        messages[i].setFlag(Flags.Flag.DELETED, true);
    }

    
    private boolean enviaArquivoPastaAuxiliar(Store store, Folder folder,
			Message[] messages, int i) throws MessagingException {
        Folder folderAux;
        System.out.println(folder);
        folderAux = getPastaAuxiliar(store);
        folder.copyMessages(messages, folderAux);
        folderAux.close(true);
        excluirMensagemInbox(messages, i);
        return true;
    }
    
    private String validarXML(Part part, Store store, Folder folder,
			Message[] messages, int i) throws MessagingException, IOException 
    {
        String fileName = part.getFileName();
        if (fileName != null) {
                int tamanhoString = fileName.length() - 3;
                if (!fileName.substring(tamanhoString).equals("xml")) {
                        return fileName;
                } else {
                        String disposition = part.getDisposition();
                        if ((disposition != null)
                                        && ((disposition.equals(Part.ATTACHMENT) || (disposition
                                                        .equals(Part.INLINE))))) {
                                salvarArquivo(part);
                                // pedro enviaArquivoPastaAuxiliar(store, folder, messages,
                                // i);
                                excluirMensagemInbox(messages, i);
                        }
                }
        }
        return fileName;
    }
    
    public void salvarArquivo(Part part) throws IOException,
			MessagingException 
    {
        FileOutputStream fileOutputStream = new FileOutputStream(
                        Constantes.PASTA_XML + part.getFileName());
        Object obj = part.getContent();
        if (obj instanceof InputStream) 
        {
            InputStream is = (InputStream) obj;
            int ch = -1;
            while ((ch = is.read()) != -1) 
            {
                fileOutputStream.write(ch);
            }
            
            
        }
        
    }
    
    public Folder getPastaCaixaEntrada(Store store) throws MessagingException {
        Folder folder;
        folder = store.getFolder(Constantes.PASTA_PRINCIPAL);
        System.out.println(folder);
        folder.open(Folder.READ_WRITE);
        System.out.println(folder);
        return folder;
    }
    
    public Folder getPastaAuxiliar(Store store) throws MessagingException {
        Folder folder;

        folder = store.getFolder(Constantes.PASTA_BACKUP);
        System.out.println(folder);
        folder.open(Folder.READ_WRITE);
        System.out.println(folder);
        return folder;
    }
    
    public Store conexaoServidorEMail() 
    {
        Session session;
        Store store = null;
        Properties prop = new Properties();
        prop.put("mail.pop3.disabletop", true);
        session = Session.getInstance(prop);
        URLName url = new URLName(Constantes.IMAP, Constantes.HOST,
                        Constantes.PORTA, Constantes.ARQUIVO_MSG, Constantes.LOGIN,
                        Constantes.SENHA);
        try {
                store = session.getStore(url);
                store.connect();
                System.out.println("Conexão estabelecida!");
        } catch (Exception e) {
                System.out.println(e.getMessage());
        }
        return store;

    }
}

package model;

import javax.mail.Folder;
import javax.mail.MessagingException;
import javax.mail.Store;

public class Main 
{
    public static void main(String[] args) throws MessagingException
    {
        new ReadEmails();
    }
    
}

:?:

Já estudei esta aplicação por horas, e não encontrei o porque deste anexo não estar sendo salvo na pasta.

Desculpa se não perguntei direito pessoal, mas resumindo, meu sonho…hehe… é salvar o anexo do email para o computador.

[b]Qualquer dica, ajuda, agradeço muito[i]

:smiley:

E o que acontece quando você debuga?

Pessoal, tentei simplificar o projeto para facilitar.

Agora aparece o arquivo na pasta, porém sem conteúdo…=/

Segue como fiz agora:


import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.URLName;

public class Email 
{
    
    public void processMail() throws MessagingException, IOException
    {
        Store store = conexaoServidorEMail();
        Folder folder = getPastaCaixaEntrada(store);
        Message[] messages = folder.getMessages();
        
        Message message = null;
        Object msgObj = null;
        Multipart multipart = null;
        Part part = null;
        String contentType = null;
        
        for(int i = 0; i < messages.length; i++)
        {
            message = messages[i];
            msgObj = message.getContent();
            
            if(msgObj instanceof Multipart)
            {
                System.out.println("Assunto: " + message.getSubject());
                multipart = (Multipart) message.getContent();
                
                for (int k = 0; k < multipart.getCount(); k++)
                {
                    part = multipart.getBodyPart(k);
                    contentType = part.getContentType();
                    System.out.println("**ContentType: " + contentType);
                    String fileName2 = part.getFileName();
                    if(fileName2 != null)
                    {
                        System.out.println(i + 1 + ": Nome do arquivo: " + fileName2);
                    }
                    
                    if(contentType.startsWith("text/plain"))
                    {
                        
                    }
                    else
                    {
                        System.out.println("Salvando arquivo..");
                        salvarArquivo(part);
                        System.out.println("Arquivo salvo!");
                    }
                }
            }
        }
    }
    
    public void salvarArquivo(Part part) throws IOException,
			MessagingException 
    {
        FileOutputStream fileOutputStream = new FileOutputStream(
                        Constantes.PASTA_XML + part.getFileName());
        Object obj = part.getContent();
        if (obj instanceof InputStream) 
        {
            InputStream is = (InputStream) obj;
            int ch = -1;
            while ((ch = is.read()) != -1) 
            {
                fileOutputStream.write(ch);
            }
            
            is.close();
            fileOutputStream.close();
            
        }
        
    }
    
    public Folder getPastaCaixaEntrada(Store store) throws MessagingException {
        Folder folder;
        folder = store.getFolder(Constantes.PASTA_PRINCIPAL);
        System.out.println(folder);
        folder.open(Folder.READ_WRITE);
        System.out.println(folder);
        return folder;
    }
    
    public Store conexaoServidorEMail() 
    {
        Session session;
        Store store = null;
        Properties prop = new Properties();
        prop.put("mail.pop3.disabletop", true);
        session = Session.getInstance(prop);
        URLName url = new URLName(Constantes.IMAP, Constantes.HOST,
                        Constantes.PORTA, Constantes.ARQUIVO_MSG, Constantes.LOGIN,
                        Constantes.SENHA);
        try {
                store = session.getStore(url);
                store.connect();
                System.out.println("Conexão estabelecida!");
        } catch (Exception e) {
                System.out.println(e.getMessage());
        }
        return store;

    }
}

Agradeço desde já! :smiley:

Quando rodo este último exemplo, aparece isto na console do netbeans:

Conexão estabelecida! Inbox Inbox Conexão estabelecida! Inbox Inbox Assunto: nfe **ContentType: multipart/alternative; boundary="=_88b3c3c22cdfecc05fe70b637aaff600" Salvando arquivo.. Arquivo salvo! **ContentType: text/plain; name="135120006820217_v2.00-procNFe (1).xml" 1: Nome do arquivo: 135120006820217_v2.00-procNFe (1).xml

Ressaltando que, tenho apenas 1 email na caixa de entrada com um arquivo anexado do tipo XML. =D

saudações

Debugando código vi que o bloco:

if (obj instanceof InputStream) 
        {
            InputStream is = (InputStream) obj;
            int ch = -1;
            while ((ch = is.read()) != -1) 
            {
                fileOutputStream.write(ch);
            }
            
            is.close();
            fileOutputStream.close();
            
        }

Não é executado porque o obj do teste é do tipo MimeMultipart, e não um inputStream…=/

Sendo assim acho que é por isso que o arquivo esta apenas sendo criado e vindo sem conteúdo algum.

Se alguém tiver alguma dica ou sujestão, aceito…

Grato desde já! =D