JavaMail - Невозможно folder.open () - PullRequest
2 голосов
/ 12 апреля 2011

Как гласит заголовок, при попытке выполнить 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());
            }
        }

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

Спасибо! Риз

1 Ответ

4 голосов
/ 12 августа 2011

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

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

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

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

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

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

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

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

...