Filtrar emails GMAIL

6 respostas
juno.rr

Olá pessoal, tudo blz?

Estou fazendo um programa para receber emails do GMAIL, está funcionando bem, o problema é que ele retorna TODOS os email da conta, não consigo filtrar os “Folders” do gmail. Exemplo, tenho um folder chamado “Drive Virtual” e gostaria de ler somente os emails não lidos desse folder. Alguém já tentou fazer algo assim?
Abaixo segue o código que fiz até agora (Dêem uma olhada no método main abaixo…). Valeu.

package emailtest;

import java.security.Security;
import java.util.List;
import java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;

/**
 *
 * @author Juno
 */
public class EmailReceiver
{

  public static final Flags.Flag
      DELETED = Flags.Flag.DELETED,
      SEEN = Flags.Flag.SEEN,
      RECENT = Flags.Flag.RECENT,
      ANSWERED = Flags.Flag.ANSWERED;

  public static final String
      GMAIL_POP_SERVER = "pop.gmail.com";

  public static final int
      GMAIL_POP_SERVER_PORT = 995;

  private String popServer,
      user, passwd, foldername;

  private int port;

  private Session session;

  private Folder folder;

  private Store store;

  private Message[] msgs;


  public EmailReceiver()
  {
    popServer = null;
    user = null;
    passwd = null;
    foldername = null;
    session = null;
    store = null;
    folder = null;
    port = GMAIL_POP_SERVER_PORT;
  }

  public EmailReceiver(String popServer, String user, String passwd)
  {
    this.popServer = popServer;
    this.user = user;
    this.passwd = passwd;
    session = null;
    store = null;
    folder = null;
    foldername = "INBOX";
  }

  public EmailReceiver folderName(String folder)
  {
    this.foldername = folder;
    return this;
  }

  public String folderName()
  {
    return foldername;
  }

  public EmailReceiver folder(Folder f)
  {
    folder = f;
    return this;
  }

  public Folder folder()
  {
    return folder;
  }

  public EmailReceiver port(int port)
  {
    this.port = port;
    return this;
  }

  public int port()
  {
    return port;
  }

  public EmailReceiver user(String user)
  {
    this.user = user;
    return this;
  }

  public String user()
  {
    return user;
  }

  public EmailReceiver password(String passwd)
  {
    this.passwd = passwd;
    return this;
  }

  public EmailReceiver server(String server)
  {
    this.popServer = server;
    return this;
  }

  public String server()
  {
    return popServer;
  }

  public EmailReceiver session(Session session)
  {
    this.session = session;
    return this;
  }

  public Session session()
  {
    return session;
  }

  public EmailReceiver store(Store store)
  {
    this.store = store;
    return this;
  }

  public Store store()
  {
    return store;
  }

  public Session createSession(Properties props)
  {
    return Session.getDefaultInstance(props);
  }

  public Session createSession()
  {
    return Session.getDefaultInstance(System.getProperties());
  }

  public Store createStore(boolean ssl)
  {
    if(session == null)
      session = this.createSession();

    Store s = null;
    if(!ssl)
      try {
        return session.getStore("pop3");
      } catch (NoSuchProviderException ex) {
        ex.printStackTrace();
        return null;
      }

    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
    session.getProperties()
        .setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
    session.getProperties()
        .setProperty("mail.pop3.socketFactory.fallback", "false");

    try {
      return session.getStore("pop3");
    } catch(NoSuchProviderException ex) {
      ex.printStackTrace();
      return null;
    }
  }

  private boolean checkConfig()
  {
    if(popServer == null || popServer.equals(""))
      return false;
    if(user == null || user.equals(""))
      return false;
    if(passwd == null || passwd.equals(""))
      return false;

    return true;
  }

  public EmailReceiver receive()
  {
    if(!checkConfig())
      throw new IllegalStateException(
          "EmailReceiver is not configured!");

    if(session == null)
      session = this.createSession();

    if(store == null)
      store = this.createStore(true);

    if(!store.isConnected())
      try {
        store.connect(popServer, port, user, passwd);
      } catch (MessagingException ex) {
        throw new IllegalStateException(ex.getMessage());
      }

    try {
      folder = store.getFolder(foldername);
      folder.open(Folder.READ_WRITE);
      msgs = folder.getMessages();
    } catch (MessagingException ex) {
      throw new IllegalStateException(ex.getMessage());
    }

    return this;
  }


  public boolean mark(Message[] messages, Flags.Flag flag, boolean set)
  {
    if(messages == null || messages.length == 0)
      throw new IllegalArgumentException(
          "Messages to be setted must be NOT NULL");
    if(flag == null)
      throw new IllegalArgumentException(
          "Flag to be setted must be NOT NULL");

    try {
      folder.setFlags(msgs, new Flags(flag), set);
      return true;
    } catch (MessagingException ex) {
      ex.printStackTrace();
      return false;
    }
  }

  public Message[] getMessages()
  {
    return msgs;
  }


  public static void main(String[] args) throws MessagingException
  {
    EmailReceiver rec = new EmailReceiver();
    rec.server(GMAIL_POP_SERVER)
        .port(GMAIL_POP_SERVER_PORT)
        .user("[email removido]")
        .password("********")
        .folderName("Drive Virtual")
        .receive();

    System.out.println(rec.folder());

    System.out.println(rec.getMessages().length + " Messages!");
  }

}

Quando uso folderName(“INBOX”), funciona, mas retorna todas as mensagens da conta e não as da caixa de entrada.
Mas quando tento user “Drive Virtual”, da erro:

INBOX
258 Messages!

Exception in thread "main" java.lang.IllegalStateException: folder is not INBOX
        at emailtest.EmailReceiver.receive(EmailReceiver.java:228)
        at emailtest.EmailReceiver.main(EmailReceiver.java:262)
Java Result: 1

6 Respostas

E

O conceito de folders só se aplica ao protocolo IMAP, não ao POP3.

juno.rr

Valeu mesmo, vou tentar usar imap.

Marcelo_Bento

amigo… você conseguiu acessas os e-mail de uma pasta? se sim, posta aí… pois estou com essa bronca aqui.

abraço.

criador

REMOVIDO POR CONTER INFORMAÇÕES PESSOAIS

juno.rr

Acabei desenvolvendo uma biblioteca que abstrai de forma mais simples o envio e recebimento de emails pelo javamail.
As biliotecas que temos hoje tratam somente do envio de emails, como a da Apache.

Está tudo bem documentado, se você quizer estudar os fontes.
Se preferir pode usar a biblioteca mesmo, na documentação, olhe o pacote com.jpower.simplemail.tutorial que explica passo a passo como utilizar.

Usei a licença GNU-LGPL v2.1, pode modificar e redistribuir.

Porém o arquivo tem 1.1MB, é muito grande para anexar no fórum, se quizer posso enviar via email.

juno.rr

Seguindo a idéia do amigo mcirqueira(http://www.guj.com.br/user/profile/132446.java), coloquei minha biblioteca de envio e recebimento de emails num folder compartilhado do dropbox, se alguém se interessar: https://www.dropbox.com/home/simplemail

Abraço.

Criado 28 de maio de 2010
Ultima resposta 7 de jun. de 2012
Respostas 6
Participantes 4