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:
packagetesteEmailReceive;importjava.io.BufferedReader;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.util.Properties;importjavax.mail.Folder;importjavax.mail.Message;importjavax.mail.MessagingException;importjavax.mail.Multipart;importjavax.mail.NoSuchProviderException;importjavax.mail.Part;importjavax.mail.Session;importjavax.mail.Store;importjavax.mail.internet.InternetAddress;importsoftware.mail.EmailAccount;publicclassInboxReader{publicstaticvoidmain(Stringargs[]){Propertiesprops=System.getProperties();props.setProperty("mail.store.protocol","imaps");try{Sessionsession=Session.getDefaultInstance(props,null);Storestore=session.getStore("imaps");store.connect("imap.gmail.com",email,password);System.out.println(store);Folderinbox=store.getFolder("Inbox");inbox.open(Folder.READ_ONLY);Messagemessages[]=inbox.getMessages();for(Messagemessage:messages){printMessage(message);}}catch(NoSuchProviderExceptione){e.printStackTrace();System.exit(1);}catch(MessagingExceptione){e.printStackTrace();System.exit(2);}}/** * "printMessage()" method to print a message. */publicstaticvoidprintMessage(Messagemessage){try{// Get the header informationStringfrom=((InternetAddress)message.getFrom()[0]).getPersonal();if(from==null)from=((InternetAddress)message.getFrom()[0]).getAddress();System.out.println("FROM: "+from);Stringsubject=message.getSubject();System.out.println("SUBJECT: "+subject);// -- Get the message part (i.e. the message itself) --PartmessagePart=message;Objectcontent=messagePart.getContent();// -- or its first body part if it is a multipart message --if(contentinstanceofMultipart){messagePart=((Multipart)content).getBodyPart(0);System.out.println("CONTEÚDO: "+messagePart.getContent().toString());}// -- Get the content type --StringcontentType=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")){InputStreamis=messagePart.getInputStream();BufferedReaderreader=newBufferedReader(newInputStreamReader(is));StringthisLine=reader.readLine();while(thisLine!=null){thisLine=reader.readLine();}}//baixar anexo:System.out.println("-----------------------------");}catch(Exceptionex){ex.printStackTrace();}}}
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=newbyte[4096];//Aqui você define o caminho que salvará o arquivo.StringcaminhoBase=System.getProperty("user.dir")+"/";Multipartmulti=(Multipart)content;for(inti=0;i<multi.getCount();i++){StringnomeDoArquivo=multi.getBodyPart(i).getFileName();if(nomeDoArquivo!=null){InputStreamis=multi.getBodyPart(i).getInputStream();FileOutputStreamfos=newFileOutputStream(caminhoBase+nomeDoArquivo);intbytesRead;while((bytesRead=is.read(buf))!=-1){fos.write(buf,0,bytesRead);}fos.close();}}}
Espero ter ajudado.
Abraço
T
Tino_
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… =/
A
aganhara1 like
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.
T
Tino_1 like
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.
packagetesteEmailReceive;importjava.io.BufferedReader;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.util.Properties;importjavax.mail.Folder;importjavax.mail.Message;importjavax.mail.MessagingException;importjavax.mail.Multipart;importjavax.mail.NoSuchProviderException;importjavax.mail.Part;importjavax.mail.Session;importjavax.mail.Store;importjavax.mail.internet.InternetAddress;importsoftware.mail.EmailAccount;publicclassInboxReader{publicstaticvoidmain(Stringargs[]){Propertiesprops=System.getProperties();props.setProperty("mail.store.protocol","imaps");try{Sessionsession=Session.getDefaultInstance(props,null);Storestore=session.getStore("imaps");store.connect("imap.gmail.com",email,password);System.out.println(store);Folderinbox=store.getFolder("Inbox");inbox.open(Folder.READ_ONLY);Messagemessages[]=inbox.getMessages();for(Messagemessage:messages){printMessage(message);}}catch(NoSuchProviderExceptione){e.printStackTrace();System.exit(1);}catch(MessagingExceptione){e.printStackTrace();System.exit(2);}}/** * "printMessage()" method to print a message. */publicstaticvoidprintMessage(Messagemessage){try{// Get the header informationStringfrom=((InternetAddress)message.getFrom()[0]).getPersonal();if(from==null)from=((InternetAddress)message.getFrom()[0]).getAddress();System.out.println("FROM:"+from);Stringsubject=message.getSubject();System.out.println("SUBJECT:"+subject);// -- Get the message part (i.e. the message itself) --PartmessagePart=message;Objectcontent=messagePart.getContent();// -- or its first body part if it is a multipart message --if(contentinstanceofMultipart){messagePart=((Multipart)content).getBodyPart(0);System.out.println("CONTEÚDO:"+messagePart.getContent().toString());}// -- Get the content type --StringcontentType=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")){InputStreamis=messagePart.getInputStream();BufferedReaderreader=newBufferedReader(newInputStreamReader(is));StringthisLine=reader.readLine();while(thisLine!=null){thisLine=reader.readLine();}}else{byte[]buf=newbyte[4096];// Aqui você define o caminho que salvará o arquivo.StringcaminhoBase=System.getProperty("user.dir")+"\\src\\testeEmailReceive\\";Multipartmulti=(Multipart)content;for(inti=0;i<multi.getCount();i++){StringnomeDoArquivo=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);InputStreamis=multi.getBodyPart(i).getInputStream();FileOutputStreamfos=newFileOutputStream(caminhoBase+nomeDoArquivo);intbytesRead;while((bytesRead=is.read(buf))!=-1){fos.write(buf,0,bytesRead);}fos.close();}}}System.out.println("-----------------------------");}catch(Exceptionex){ex.printStackTrace();}}}
A
augustovieira
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!
A
aganhara
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.
A
augustovieira
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.
T
Tino_
pelo o que compreendi utilizando a API JavaMail, nós podemos especificar atraves desse código:
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!
T
Tino_
demoro cara, posta ae qlqr coisa…
abraçoo!
A
aganhara
augustovieira, de acordo com a API também é possível procurar e-mail específico de acordo com algum critério.
A
augustovieira
Se é mesmo possível buscar um email específico vai resolver 100% o que eu quero fazer! Show de bola!
A
augustovieira
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.
T
Tino_
é só pegar o jar do javamail e jogar no classpath…
o resto é arquvo pra ajudar vc…
demos e etc…
A
augustovieira
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?
T
Tino_
ta na primeira pasta brother…
o dentro da pasta que você baixou, ele chama MAIL.jar
A
augustovieira
Infelizmente procurei nas pastas que fiz download e não tem nenhum jar. Única coisa que tem é um mail.sig
trocou o email por seu email ? e password pela sua senha?
Abraço!
A
aganhara
Exatamente o que eu ia falar, rs. Tá dando conexão negada.
Se for outro servidor de e-mail tem que fazer as configurações de imap dele
T
Tino_
sim…
hehehe
A
augustovieira
Sim sim , alterei o email para [email removido] e a senha coloquei a senha do email, porém está dando isso! É erro de conexão negada? Pode ser erro de senha ou bloqueio de proxy?
T
Tino_
você tem email no gmail ?
se sim , coloca ele e a senha dele pra você testar!
e ve se conecta, se conectar ai vc vai atraz de achar um imap para o outro que vc quer!
A
augustovieira
Sim sim, coloquei meu login e senha do gmail, antes de faze no email que quero estou testando no gmail mesmo. Porém como falei anteriormente aconteceu aquele erro. Estou tentando ver aqui, creio que é algo com proxy ou porta que tenho que liberar. Após eu conseguir fazer funcionar o negócio, vou achar o imap do email que quero e desenvolver em cima dele.
T
Tino_
No meu chegou a dar esse erro,
mas era coisa de senha e usuario!
A
augustovieira
Verifiquei tudo aqui e meu login e senha está certo, tentei com o @gmail.com e tudo mas não deu. Continua dando o mesmo erro. Eu entro com a mesma senha pelo gmail.com e lá loga normal.
A
augustovieira
Bom para tirar qualquer dúvida criei um GMAIL de teste com login [email removido] e senha testeguj1234
Mesmo assim moço, acha que eu não iria ter tentado sem o @gmail.com? fiz como tu disse antes e o erro persiste. não estou entendendo o porque
T
Tino_
cara,
Sei lá…
já olhei umas 5 vezes nossos codigos estão identicos…
aqui está funcionando… to sem ideias, mas to pesquisando aqui…
da uma pesquisada ai também …
A
augustovieira
Tu executa o código pelo Java Application?
A
aganhara
Fiz a mesma coisa aqui e funcionou normalmente.
T
Tino_
sim, java application!
dentro do java mesmo…
T
Tino_
dentro do eclipse mesmo… rsrs
A
augustovieira
Pai do céu!!! O que você tem contra mim? kkkkk essa merda só não funciona aqui!!! Estou tentando descobrir o porque está dando esse erro mas não ta fácil não! Não achei que iria ser tão difícil fazer isso.
O
oyama
Se você acessa a Internet no browser através de um proxy, tem que configurar isto no seu código, ou pedir para habilitar a porta no firewall da sua empresa…
T
Tino_
boa oyama…
é isso mesmo… todos os detalhes que tiver para acessar a web no browser vc terá que configurar no seu codigo, porque ele está
acessando a web também…
A
augustovieira
Fiz de uma outra forma e deu certo, muito obrigado pela atenção.
A
aganhara
a título de curiosidade, qual foi sua solução?
A
augustovieira
Utilizei um esquema que tinha feito a um tempo atrás na empresa de consultar conexão com base de email, mas o que tava faltando era fazer a segurança de dados, fiz um esquemas de ssl que grava em um arquivo .jks na minha maquina. Então ele conseguiu fazer a conexão certinha, e outra… consegui conectar no webmail da minha empresa, então matei 2 coelhos com 1 paulada só kkk muito obrigado!!
Obs: não posto o código por ser exclusivo da empresa.
T
Tino_
digo o mesmo aganhara…rsrsrs
qual foi sua solução!
A
augustovieira
Tino_ fico muito feliz de me tornar um JavaBaby trocando idéias contigo kkkkkkkkkkkkk
T
Tino_
hahahahaa, digo o mesmo amigo…
F
FredMestre
Tentei verificar se a mensagem possui anexo da forma dita: