JavaMail - невозможно folder.open ()

Как говорится в заголовке, при попытке выполнить folder.open () он терпит неудачу, не выдает ошибки, поэтому найти причину сложно. В моей консоли отладки появляется следующая ошибка, но она может / не может быть связана (она появляется только после нажатия кнопки «Возобновить» после точки останова folder.open ()).

Я использую JavaMail API для Android для разработки. Все работало нормально для серверов IMAP, но мне также нужно иметь возможность подключаться к почтовым серверам POP3. Магазин, к которому подключается GMAIL, и все необходимые настройки были изменены в моей учетной записи GMAIL.

04-12 13:22:26.682: INFO/dalvikvm(436): Ljava/lang/IllegalStateException;: Folder is not Open
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.checkOpen(POP3Folder.java:512)
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.close(POP3Folder.java:227)
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.finalize(POP3Folder.java:506)
04-12 13:22:26.682: INFO/dalvikvm(436):     at dalvik.system.NativeStart.run(Native Method)

Способ подключения для pop3 следующий:

String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

        Properties pop3Props = new Properties();

        pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
        pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");
        pop3Props.setProperty("mail.pop3.port",  "995");
        pop3Props.setProperty("mail.pop3.socketFactory.port", "995");

        URLName url = new URLName("pop3", "pop.gmail.com", 995, "",
                "******@googlemail.com", "*****");

        //session = Session.getInstance(pop3Props, null);
        Session session = Session.getInstance(pop3Props, new javax.mail.Authenticator() 
        {   
            protected PasswordAuthentication getPasswordAuthentication() 
            {
                return new PasswordAuthentication("***********", "*****");
            }
        });

        session.setDebug(true);

        store = new POP3SSLStore(session, url);
        store.connect();

Способ подключения к магазину следующий (где возникают проблемы):

folders = store.getFolder("INBOX");
        //Folder folder = store.getFolder("INBOX");
        if (folders.isOpen()) 
        {
            if ((folders.getMode() & Folder.READ_WRITE) != 0) 
            {
                folders.close(false);
                folders.open(Folder.READ_ONLY);
            }
        } 
        else 
        {
            try
            {
                folders.open(Folder.READ_ONLY);
            }
            catch (Exception e)
            {
                Log.i("Folder Opening,", e.toString());
            }
        }

Любые идеи были бы полезны! Сессия отлажена, проблем не обнаружено. Если вам нужна дополнительная информация, не стесняйтесь спрашивать! Я уверен, что я не единственный, у кого эта проблема.

Спасибо! Рис


person Rhys12341111    schedule 12.04.2011    source источник


Ответы (1)


Итак, мы тоже столкнулись с этой проблемой.

Я рассмотрел реализацию POP3Folder, в которой вызывается это исключение.

Похоже, что POP3Folder переопределяет finalize (), чтобы выполнить некоторую очистку до того, как объект перестанет существовать. Переопределение finalize () вызывает close (), который проверяет, открыта ли папка, а если нет, вы видите IllegalStateException, брошен.

Вот почему вы можете видеть это время от времени; это происходит, когда GC приходит, чтобы взглянуть на ваш объект, и в этот момент папка, возможно, уже была закрыта, поэтому к моменту вызова finalize () close (), проверка того, открыта ли папка, вызовет исключение.

Теперь я не могу сказать, умно это или глупо. Кажется, что код был бы лучше, если бы close () просто игнорировал тот факт, что папка уже закрыта и двигалась дальше, вместо того, чтобы генерировать исключение.

POP3Folder принимает параметризованный конструктор. К сожалению, он не является общедоступным или защищенным, поэтому вы не можете просто унаследовать его и переопределить метод close (), удалив проверку того, открыта ли папка.

Но, поскольку стек вызовов исключений исходит из finalize (), он должен уменьшить опасность оставить его в покое, поскольку любое исключение, созданное из finalize (), обычно только остановить процесс завершения (сборка мусора) для этого объекта, не причинив гораздо большего ущерба.

Однако хотелось бы увидеть правильное решение для этого.

person Andrey Butov    schedule 12.08.2011