Производительность Javamail - PullRequest
5 голосов
/ 29 марта 2010

Я использую javamail для получения почты с сервера IMAP (в настоящее время GMail). Javamail очень быстро получает список сообщений (только идентификаторы) в определенной папке с сервера, но когда я на самом деле получаю сообщение (только конверт, даже не содержимое), это занимает от 1 до 2 секунд для каждого сообщения. Какие приемы следует использовать для быстрого поиска?

вот мой код:

    try {
        IMAPStore store = null;
        if(store!=null&&store.isConnected())return;
        Properties props = System.getProperties();
        Session sessionIMAP = Session.getInstance(props, null);
        try {
            store = (IMAPStore) sessionIMAP.getStore("imaps");
            store.connect("imap.gmail.com",993,"username@gmail.com","password");
        } catch (Exception e) {
            e.printStackTrace();
        }

        IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX");
        folder.open(Folder.READ_ONLY);
        System.out.println("start");
        Message[] msgs = folder.getMessages(1,10);
        long ftime = System.currentTimeMillis();
        FetchProfile fp=new FetchProfile();
        fp.add(FetchProfile.Item.ENVELOPE);
        folder.fetch(msgs, fp);
        long time = System.currentTimeMillis();
        System.out.println("fetch: "+(time-ftime));
        for (Message message : msgs) {
            System.out.println(message.getSubject());
            Address[] from = message.getFrom();
            for (Address address : from) {
                System.out.println(address);
            }
            Address[] recipients = message.getAllRecipients();
            for (Address address : recipients) {
                System.out.println(address);
            }

        }
        long newTime = System.currentTimeMillis();
        System.out.println("convert: "+(newTime-time));
    }catch (Exception e) {
        e.printStackTrace();
    }


}

Ответы [ 4 ]

4 голосов
/ 24 июня 2011

Я полагаю, что Gmail ограничивает чтение сообщений IMAP каждую секунду или около того. Возможно, вы сможете ускорить его с несколькими подключениями IMAP.

1 голос
/ 10 октября 2013

Я сталкиваюсь с тем же. После профилирования я заметил, что getBody вызывался каждый раз, когда я пытался сделать message.getFrom (), как вы, хотя я только обращался к полям, которые должны быть закрыты флагом Envelope. Смотри https://java.net/projects/javamail/forums/forum/topics/107956-gimap-efficiency-when-only-reading-headers

1 голос
/ 29 марта 2010

Я не уверен, что это проблема Javamail, насколько это может быть проблема Gmail. У меня есть приложение, которое получает почту из нескольких источников, включая Gmail, и Gmail определенно самый медленный. API Javamail довольно прост, но было бы трудно вносить предложения, не видя, что вы в данный момент делаете.

0 голосов
/ 25 ноября 2018

Пожалуйста, установите для свойства mail.imap.fetchsize требуемый размер. по умолчанию это 16к. Если вы увеличите размер этого свойства, скорость извлечения возрастет.

props.put("mail.imap.fetchsize", "3000000");

Обратите внимание, что если вы используете протокол "imaps" для доступа к IMAP через SSL, все свойства будут называться "mail.imaps. *".

Удачи.

Янов

...