JavaMail-не удается папка.открывать()


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

Я использую JavaMail API для Android для разработки. Все работало нормально для серверов IMAP, но мне нужно также иметь возможность подключаться к почтовым серверам POP3. В магазин подключен к is 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 2

1 ответ:

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

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

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

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

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

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

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

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