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();
}
}
}
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.
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();
}
}
else {
byte[] buf = new byte[4096];
// Aqui você define o caminho que salvará o arquivo.
String caminhoBase = System.getProperty("user.dir") +"\\src\\testeEmailReceive\\";
Multipart multi = (Multipart) content;
for (int i = 0; i < 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("-----------------------------");
} catch (Exception ex) {
ex.printStackTrace();
}
}
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.
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!
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?