Не удалось открыть папку javamail

Я разработал веб-сайт электронной почты, используя javamail и apache-james, и в основном он работает хорошо. Но какой-то пользователь получил исключение Open failed Exception и не может получать новую почту. Код получения письма:

Session mailSession = Session.getInstance(System.getProperties(), null);
mailSession.setDebug(false);
Store store = null;
Folder folder = null; //javax.mail.Folder
try {
    store = mailSession.getStore(SParam.PROTOCOL);
    store.connect(Property.getPop3(), userName, password);
    logger.info("trying to receive emails from james server...");
    folder = store.getFolder("INBOX");
    try {
        if (!folder.isOpen()) {
            folder.open(Folder.READ_WRITE); //the point of throwing the exception
        }
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    //receive email from james server.
} catch (Exception e) {
    logger.error("Email Receive Error!" + StackTraceStr.st2str(e));
    try {
        folder.close(true);
    } catch (Exception e2) {
}
} finally {
    try {
        store.close();
    } catch (Exception cloex) {
    }
}

В большинстве случаев он работает просто отлично. Но все равно иногда вылетала ошибка:

javax.mail.MessagingException: Open failed;
nested exception is:
java.io.IOException: STAT command failed: null
at com.sun.mail.pop3.POP3Folder.open(POP3Folder.java:228)
at com.csc.mail.jsh.mail.core.ReceiveMail.receive(ReceiveMail.java:82)
at com.csc.mail.jsh.mail.core.ReceiveMail.run(ReceiveMail.java:222)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.io.IOException: STAT command failed: null
at com.sun.mail.pop3.Protocol.stat(Protocol.java:366)
at com.sun.mail.pop3.POP3Folder.open(POP3Folder.java:203)
... 3 more

Жду вашей помощи и большое спасибо!

Я отлаживал и отлаживал, наконец, обнаружил, что команда STAT не удалась! когда команда STAT получила ошибку, есть исключение james, но это не имеет смысла!

21/11/12 14:39:16 ERROR pop3server: Exception during connection from 127.0.0.1     
    (127.0.0.1) : An exception occurred getting a database connection.
    org.apache.avalon.framework.CascadingRuntimeException: An exception occurred getting a database connection.
at org.apache.james.userrepository.AbstractJdbcUsersRepository.openConnection(AbstractJdbcUsersRepository.java:617)
    at org.apache.james.userrepository.AbstractJdbcUsersRepository.getUserByName(AbstractJdbcUsersRepository.java:521)
    at org.apache.james.userrepository.AbstractUsersRepository.test(AbstractUsersRepository.java:270)
    at org.apache.james.core.LocalUsersRepository.test(LocalUsersRepository.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.avalon.phoenix.components.application.BlockInvocationHandler.invoke(BlockInvocationHandler.java:134)
    at $Proxy4.test(Unknown Source)
    at org.apache.james.pop3server.POP3Handler.doPASS(POP3Handler.java:537)
    at org.apache.james.pop3server.POP3Handler.parseCommand(POP3Handler.java:479)
    at org.apache.james.pop3server.POP3Handler.handleConnection(POP3Handler.java:277)
    at org.apache.james.util.connection.ServerConnection$ClientConnectionRunner.run(ServerConnection.java:432)
    at org.apache.excalibur.thread.impl.ExecutableRunnable.execute(ExecutableRunnable.java:55)
    at org.apache.excalibur.thread.impl.WorkerThread.run(WorkerThread.java:116)
Caused by: java.sql.SQLException: Listener refused the connection with the following error:
    ORA-12519, TNS:no appropriate service handler found
    The Connection descriptor used by the client was: 192.168.250.23:1521:csmis
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:387)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:439)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
    at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)
    at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)
    at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:771)
    at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
    at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
    at org.apache.james.util.dbcp.JdbcDataSource.getConnection(JdbcDataSource.java:220)
    at org.apache.james.userrepository.AbstractJdbcUsersRepository.openConnection(AbstractJdbcUsersRepository.java:614)
... 15 more

Все приложения работают на одном сервере, и в сети всего несколько пользователей (когда я тестирую его, им пользуюсь только я). Просто иногда появляется ошибка. Почему?


person Joshua    schedule 13.11.2012    source источник
comment
Больше похоже на сбой на стороне сервера, который может происходить время от времени. Это ваш сервер? Возникает ли проблема также при использовании обычной почтовой программы?   -  person Alexandre Lavoie    schedule 13.11.2012
comment
@AlexandreLavoie Я использую Apache james. И написать clint-сторону самостоятельно, используя javamail. Сейчас у нас около 200 пользователей (часто использующих) и 30 000 электронных писем.   -  person Joshua    schedule 13.11.2012
comment
Проверяли ли вы максимальное количество одновременных сеансов или подключений? Как и мой сервер в IMAP, я много раз достигал такого предела. Почти все веб-программы имеют конфигурации для установки ограничений на количество одновременных подключений.   -  person Alexandre Lavoie    schedule 13.11.2012
comment
Спасибо @AlexandreLavoie. Но я не совсем уверен, потому что, когда пользователь входит в систему, все электронные письма могут быть успешно получены (около 35 новых писем). Но пользователь yan не смог (138 новых писем).   -  person Joshua    schedule 13.11.2012
comment
Итак, ваша проблема случайна или связана с конкретными пользователями? У вас есть доступ к журналам сервера?   -  person Alexandre Lavoie    schedule 13.11.2012
comment
@AlexandreLavoie случайно, я думаю. Просто очень странно. Пользователь пожаловался, что некоторые из них не могут получать новые письма с 20 октября. Итак, я проверил журнал, но ничего полезного, кроме исключений выше. Я импортировал базу данных в лабораторию и тестировал локально, иногда не может получить, но иногда может. Я действительно не могу найти причину.   -  person Joshua    schedule 14.11.2012


Ответы (2)


Похоже проблема с почтовым сервером. Команда STAT используется для отображения количества сообщений. Обычно STAT — это первая команда, которая запускается после успешного подключения к почтовому серверу.

Попробуйте использовать mailSession.setDebug(true) для входа в режим отладки, чтобы получить больше журналов ошибок.

person Alex Cheng    schedule 13.11.2012
comment
Кажется хорошей идеей. Я изменю его и посмотрю, что произошло. Но файл журнала действительно расширился быстро. Спасибо @AlexCheng - person Joshua; 14.11.2012
comment
[2012-11-15 14:22:01] com.csc.mail.jsh.mail.core.ReceiveMail: [ИНФОРМАЦИЯ] - попытка получить электронные письма с сервера Джеймса... C: STAT S: -ERR C: ВЫХОД S: +OK Сервер POP3 Apache James выходит из системы. [2012-11-15 14:22:03] com.csc.mail.jsh.mail.core.ReceiveMail: [ОШИБКА] - Ошибка открытия папки: javax.mail.MessagingException: Ошибка открытия; вложенное исключение: java.io.IOException: команда STAT не выполнена: null в com.sun.mail.pop3.POP3Folder.open(POP3Folder.java:228) в com.csc.mail.jsh.mail.core.ReceiveMail.receive (ReceiveMail.java:82) в com.csc.mail.jsh.mail.core.ReceiveMail.run... - person Joshua; 16.11.2012

Я связался с Apache James и наконец нашел ответ. Вы можете найти его здесь: команда STAT иногда не удавалась. В конце страницы была указана тема.

person Joshua    schedule 30.11.2012