Manera correcta de sondear la bandeja de entrada de GMail para el correo entrante desde una aplicación independiente

Estoy tratando de sondear la bandeja de entrada de GMail para el correo entrante. Esto es lo que tengo:

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.event.MessageCountEvent;
import javax.mail.event.MessageCountListener;

import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;

public class GmailIncomingTest {

    public static void main(String[] args) {
        try {
            String username = "[email protected]";
            String password = "mypassword";

            Properties properties = new Properties();
            properties.put("mail.smtp.auth", "true");
            properties.put("mail.smtp.host", "smtp.gmail.com");
            properties.put("mail.smtp.port", "587");

            Session session = Session.getDefaultInstance(properties, new Authenticator() {

                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });

            IMAPStore store = (IMAPStore) session.getStore("imaps");
            store.connect("smtp.gmail.com", username, password);

            IMAPFolder inbox = (IMAPFolder) store.getFolder("inbox");
            inbox.open(Folder.READ_ONLY);

            inbox.addMessageCountListener(new MessageCountListener() {

                @Override
                public void messagesRemoved(MessageCountEvent event) {

                }

                @Override
                public void messagesAdded(MessageCountEvent event) {
                    Message[] messages = event.getMessages();

                    for (Message message : messages) {
                        try {
                            System.out.println("Mail Subject:- " + message.getSubject());
                        } catch (MessagingException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });

            new Thread(new Runnable() {
                private static final long KEEP_ALIVE_FREQ = 10000;

                @Override
                public void run() {
                    while (!Thread.interrupted()) {
                        try {
                            inbox.idle();
                            Thread.sleep(KEEP_ALIVE_FREQ);                                  
                        } catch (InterruptedException e) {
                        } catch (MessagingException e) {
                        }
                    }
                }
            }).start();                 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Me gustaría saber si esta es una forma correcta de hacer esto o si hay otra mejor manera.

Respuestas a la pregunta(2)

Su respuesta a la pregunta