11

下面是用于连接 IMAP 文件夹并对其执行操作的代码。所以我的问题是关于javax.mail.Session在这种情况下会每秒重新创建哪个(取决于 checkInbox() 的睡眠时间和运行时)。

我确信这不是一个好的解决方案,尤其是在 IMAP 上进行轮询有点愚蠢,但我无法IMAP listener运行。

不是每次运行都重新创建会话可能是一个更好的解决方案,但我怎么知道何时session is closed或可以故意关闭它?但是有没有什么像Session.close()或者是Session比NULL?或者会话上是否有一些定义的超时......

来源

final String port = "993";

Properties prop = new Properties();

// I assume there is some redundancy here but this didn't cause any problems so far
prop.setProperty("mail.imaps.starttls.enable", "true");
prop.setProperty("mail.imaps.port", port);

/** This part can be removed
 * prop.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
 * prop.setProperty("mail.imaps.socketFactory.port", port); 
 * prop.setProperty("mail.imaps.socketFactory.fallback", "false"); 
 */
prop.setProperty("mail.imap.ssl.enable", "true");
prop.setProperty("mail.debug", "false");

// Create a session before you loop since the configuration doesn't change
Session session = Session.getInstance(prop);

// Nearly loop forever in Prod
while(true){

    // Check the INBOX and do some other stuff
    Store store = session.getStore("imaps");
    store.connect(host, user, pw);

    // ... the operations on the session ... 

    store.close();

// Sleep a bit try & catch removed
Thread.sleep(1000);
}

总而言之,我不得不说很难为 javax.mail 找到好的示例和文档(除了APIFAQ

4

1 回答 1

17

Session只是管理配置信息;没有必要关闭它。只要您的配置没有改变,您可以在开始时创建一次 Session 并继续使用它。

另一方面,连接很昂贵,需要由应用程序仔细管理。一个连接用于存储和每个打开的文件夹。连接可以随时关闭,由服务器或由于网络故障。如果一个连接没有被积极使用,你应该关闭它。

您是否在JavaMail 项目页面上找到了 JavaMail 规范和示例应用程序?他们将帮助解决许多简单的问题,但连接管理是一个更高级的问题。

哦,你可以删除所有套接字工厂的东西,让你的应用程序更简单。

于 2013-07-25T23:34:54.020 回答