Reputation: 19
how do I get new emails in a certain range using JavaMail? Ex: Every 2 seconds, the server checks to see if there is any new email in Gmail.
I can do the whole process of getting the email, I just need it. The system will give you a refresh every time a new email arrives.
Reason: I am making a notification screen, and whenever a new email arrives, I need to show this screen.
Thank you.
My code:
public void lerEmail() {
try {
campolog.setContentType("text/html");
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
Session session = Session.getInstance(props);
Store store = session.getStore("imaps");
store.connect("pop.gmail.com", "[email protected]", "senha");
// javax.mail.Folder[] folders = store.getDefaultFolder().list("*");
// for (javax.mail.Folder folder : folders) {
// if ((folder.getType() & javax.mail.Folder.HOLDS_MESSAGES) != 0) {
// System.out.println(folder.getFullName() + ": " + folder.getMessageCount());
// }
// }
SortTerm[] termos = new SortTerm[1];
termos[0] = SortTerm.ARRIVAL;
Folder pastaEmail = store.getFolder("SMS");
pastaEmail.open(Folder.READ_ONLY);
Message[] mensagens = pastaEmail.getMessages();
//System.out.println("Total de E-mails: " + mensagens.length);
if (mensagens.length > 0) {
int ultimaMensagem = mensagens.length - 1;
campolog.setText("Mensagem: " + mensagens[ultimaMensagem].getContent().toString());
extrair();
} else {
System.out.println("Não há E-mails.");
}
pastaEmail.close(false);
store.close();
} catch (NoSuchProviderException e) {
System.out.println("Erro: " + e);
} catch (MessagingException | IOException e) {
System.out.println("Erro: " + e);
}
}
Upvotes: 0
Views: 804
Reputation: 19
I got. In this example I get my emails normally. If I receive new emails, my application "reads" this automatically.
public void lerEmail() {
try {
campolog.setContentType("text/html");
// (1) Informações do Servidor
Properties props = new Properties();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.required", "true");
props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
Session session = Session.getInstance(props);
// (2) Conexão com o servidor
Store store = session.getStore("imaps");
store.connect("smtp.gmail.com", "[email protected]", "senha");
// Buscar referência das pastas (Não precisa tirar o comentario, só se você quiser saber o nome das pastas).
// Folder[] nomePastas = store.getDefaultFolder().list("*");
// for (Folder pasta : nomePastas) {
// if ((pasta.getType() & Folder.HOLDS_MESSAGES) != 0) {
// System.out.println(pasta.getFullName() + ": " + pasta.getMessageCount());
// }
// }
// (3) Escolhemos a pasta INBOX e colocamos no modo "Ler e Escrever (READ_WRITE)" (Isso "autoriza" a modificação de "Não Lido" para "Lido")
SortTerm[] termos = new SortTerm[1];
termos[0] = SortTerm.ARRIVAL;
Folder pastaEmail = store.getFolder("INBOX");
pastaEmail.open(Folder.READ_WRITE);
// (4) Cria filtro para mensagens não lidas.
Flags visto = new Flags(Flags.Flag.SEEN);
FlagTerm filtroNaoLidas = new FlagTerm(visto, false);
// (5) Cria filtro para "ler" apenas um "endereço".
FromStringTerm filtroEmail = new FromStringTerm("@abnerRodrigues.com.br"); //Se você quiser ler email de apenas um destinatário, faça a modificação
// (6) Combina os filtros em um só.
SearchTerm filtros = new AndTerm(filtroNaoLidas, filtroEmail);
//Message[] mensagens = pastaEmail.getMessages(); //Aqui pega todas os emails.
Message[] mensagens = pastaEmail.search(filtros); //Aqui filtra os emails de acordo com o que queremos.
for (int q = 0; q < mensagens.length; q++) {
mensagens[q].setFlag(Flag.SEEN, true);
}
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
pastaEmail.open(Folder.READ_WRITE);
// Fazemos a primeira leitura de emails.
int start = 1;
int end = pastaEmail.getMessageCount();
while (start <= end) {
// new messages that have arrived
start = end + 1;
end = pastaEmail.getMessageCount();
}
// Adicionando um MessageCountListener to "ouvir" novas mensagens
pastaEmail.addMessageCountListener(new MessageCountAdapter() {
@Override
public void messagesAdded(MessageCountEvent ev) {
try {
Message[] msgs = pastaEmail.search(filtros);
for (Message msg : msgs) {
Notificacao nf = new Notificacao();
nf.setVisible(true);
dispose();
}
} catch (MessagingException ex) {
Logger.getLogger(Notificacao.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
// Aguardando novas mensagens
for (;;) {
((IMAPFolder) pastaEmail).idle();
}
} catch (MessagingException ex) {
Logger.getLogger(Notificacao.class.getName()).log(Level.SEVERE, null, ex);
}
}
}, delay, interval);
//System.out.println("Total de E-mails: " + mensagens.length);
if (mensagens.length > 0) {
int ultimaMensagem = mensagens.length - 1;
campolog.setText("Mensagem: " + mensagens[ultimaMensagem].getContent().
} else {
System.out.println("Não há E-mails não lidos.");
campotelefone.setText("");
campolog.setText("<html><head></head><body><b> <center><font face= Arial><font size=6><font color=black> NÃO HÁ RESPOSTA DO MORADOR! </font></center></b></body></html>");
}
pastaEmail.close(false);
store.close();
} catch (NoSuchProviderException e) {
System.out.println("Erro: " + e);
} catch (MessagingException | IOException e) {
System.out.println("Erro: " + e);
}
}
Upvotes: 0