问题 JavaMail是否支持服务器推送?


JavaMail是否支持通过服务器推送通知新电子邮件?

如果是,那么文档在哪里? 如果没有,是否有可以执行此操作的库?


1775
2017-12-08 16:48


起源



答案:


你应该使用IMAPFolder idle 用于向服务器发出idle命令的函数。然后,它将侦听事件,例如新邮件或已删除的邮件。 (请参阅IMAP规范以查看消息的外观)。你应该使用一个 MessageCountListener 当邮箱中的许多电子邮件发生变化时执行代码。

IMAP的空闲功能正是为了模仿“推送”功能。

http://java.sun.com/products/javamail/javadocs/javax/mail/event/MessageCountListener.html
http://java.sun.com/products/javamail/javadocs/com/sun/mail/imap/IMAPFolder.html

对不起,我没有发布任何显示如何使用它的代码。我不想浪费我的时间,因为如果你搜索这些东西,互联网上有很多现成的例子。

但是要预先警告,由于idle命令阻塞,此方法不适用于多个IMAP帐户。除非你想要所有人都在不同的线程上(糟糕的主意)。


11
2018-01-07 20:03



那么,如果我有3个imap服务器的3个Store对象,我不能使用服务器推送?那很难过:-( - Timo
您可以。你有两个选择。我不知道你在谈论多少个IMAP连接,这就是我不推荐线程的原因。但是如果你只想要三个,那么最简单的方法就是做到这一点,只有三个线程根本就没有。为每个IMAP存储创建一个线程并发出 idle 命令。之前 idle 虽然命令确保分配一个 MessageCountListener 对象,然后 idle。然后,每个线程将处理您的三个帐户中的每一个。第二个更复杂的选项涉及手动管理套接字,包括读取和写入套接字。 - casey
数字“3”只是一个随机数来解释我的意思。实际上我的程序将不得不同时处理成千上万的IMAP连接。我想这里的线程并不是一个好主意。 - Timo


答案:


你应该使用IMAPFolder idle 用于向服务器发出idle命令的函数。然后,它将侦听事件,例如新邮件或已删除的邮件。 (请参阅IMAP规范以查看消息的外观)。你应该使用一个 MessageCountListener 当邮箱中的许多电子邮件发生变化时执行代码。

IMAP的空闲功能正是为了模仿“推送”功能。

http://java.sun.com/products/javamail/javadocs/javax/mail/event/MessageCountListener.html
http://java.sun.com/products/javamail/javadocs/com/sun/mail/imap/IMAPFolder.html

对不起,我没有发布任何显示如何使用它的代码。我不想浪费我的时间,因为如果你搜索这些东西,互联网上有很多现成的例子。

但是要预先警告,由于idle命令阻塞,此方法不适用于多个IMAP帐户。除非你想要所有人都在不同的线程上(糟糕的主意)。


11
2018-01-07 20:03



那么,如果我有3个imap服务器的3个Store对象,我不能使用服务器推送?那很难过:-( - Timo
您可以。你有两个选择。我不知道你在谈论多少个IMAP连接,这就是我不推荐线程的原因。但是如果你只想要三个,那么最简单的方法就是做到这一点,只有三个线程根本就没有。为每个IMAP存储创建一个线程并发出 idle 命令。之前 idle 虽然命令确保分配一个 MessageCountListener 对象,然后 idle。然后,每个线程将处理您的三个帐户中的每一个。第二个更复杂的选项涉及手动管理套接字,包括读取和写入套接字。 - casey
数字“3”只是一个随机数来解释我的意思。实际上我的程序将不得不同时处理成千上万的IMAP连接。我想这里的线程并不是一个好主意。 - Timo


Store事件侦听后端存储发出的通知:

http://java.sun.com/products/javamail/javadocs/javax/mail/event/StoreEvent.html

但根据我的经验,java邮件文档是 所以 在某些地方,找到正在发生的事情的最好方法是自己调试整个过程。

这也是一个很好的全方位资源; JavaMail FAQ:

http://www.oracle.com/technetwork/java/faq-135477.html


1
2017-12-16 20:33



嗯,关于服务器推送的常见问题解答中没有任何内容:/ - Timo
我以为你想要一些java邮件的方式来收听你的服务器在邮件到达时发送的通知。对不起,如果我误解了! - davek
实际上,这正是我想要的。非常感谢StoreEvent上的提示。 Store类有一个名为addStoreListener(StoreListener l)的方法,可用于注册侦听器以捕获StoreEvent。 JavaMail FAQ虽然没有说明任何内容。 - Timo
你确定StoreEvent是你想要的吗?我只是看着它,看起来不像是在新邮件上通知(也许我错了,但我知道我的方式有效)。如果你想要新的邮件通知,你不应该看那个。请参阅下面的答案...... - casey