JavaMail IMAP sobre SSL bastante lento - Recopilación masiva de múltiples mensajes


1 Answers

Debe agregar un FetchProfile a la bandeja de entrada antes de recorrer los mensajes. El mensaje es un objeto de carga lenta, volverá al servidor para cada mensaje y para cada campo que no se proporcionó con el perfil predeterminado. p.ej

for (Message message: messages) {
  message.getSubject(); //-> goes to the imap server to fetch the subject line
}

Si desea mostrar como una lista de la bandeja de entrada de decir solo De, Asunto, Enviado, Adjunto, etc., usaría algo como lo siguiente

    inbox.open(Folder.READ_ONLY);
    Message[] messages = inbox.getMessages(start + 1, total);

    FetchProfile fp = new FetchProfile();
    fp.add(FetchProfile.Item.ENVELOPE);
    fp.add(FetchProfileItem.FLAGS);
    fp.add(FetchProfileItem.CONTENT_INFO);

    fp.add("X-mailer");
    inbox.fetch(messages, fp); // Load the profile of the messages in 1 fetch.
    for (Message message: messages) {
       message.getSubject(); //Subject is already local, no additional fetch required
    }

Espero que ayude.

java ssl imap javamail

Actualmente estoy tratando de usar JavaMail para recibir correos electrónicos de servidores IMAP (Gmail y otros). Básicamente, mi código funciona: de hecho puedo obtener los encabezados, el contenido del cuerpo, etc. Mi problema es el siguiente: cuando se trabaja en un servidor IMAP (sin SSL), básicamente se requieren 1-2ms para procesar un mensaje. Cuando voy a un servidor IMAPS (por lo tanto, con SSL, como Gmail) llego a alrededor de 250 m / mensaje. SOLO mido el tiempo al procesar los mensajes (la conexión, el protocolo de enlace y demás NO se tienen en cuenta).

Sé que ya que es SSL, los datos están encriptados. Sin embargo, el tiempo de descifrado no debería ser tan importante, ¿verdad?

He intentado establecer un valor de ServerCacheSize más alto, un tamaño de pool de conexión más alto, pero me estoy quedando sin ideas. ¿Alguien enfrentado con este problema? Resuelto que uno podría esperar?

Mi temor es que la API de JavaMail use una conexión diferente cada vez que busque un correo desde el servidor IMAPS (que involucra la sobrecarga del handshake ...). Si es así, ¿hay alguna manera de anular este comportamiento?

Aquí está mi código (aunque bastante estándar) llamado desde la clase Main ():

 public static int connectTest(String SSL, String user, String pwd, String host) throws IOException,
                                                                               ProtocolException,
                                                                               GeneralSecurityException {

    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", SSL);
    props.setProperty("mail.imaps.ssl.trust", host);
    props.setProperty("mail.imaps.connectionpoolsize", "10");

    try {


        Session session = Session.getDefaultInstance(props, null);

        // session.setDebug(true);

        Store store = session.getStore(SSL);
        store.connect(host, user, pwd);      
        Folder inbox = store.getFolder("INBOX");

        inbox.open(Folder.READ_ONLY);                
        int numMess = inbox.getMessageCount();
        Message[] messages = inbox.getMessages();

        for (Message m : messages) {

            m.getAllHeaders();
            m.getContent();
        }

        inbox.close(false);
        store.close();
        return numMess;
    } catch (MessagingException e) {
        e.printStackTrace();
        System.exit(2);
    }
    return 0;
}

Gracias por adelantado.



Related