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