2012-11-13 57 views
4

我正在使用java邮件API实现IMAP客户端。我想要通知有关邮件计数和对邮件所做的更改(读取/未读等)。对于这一点,我已经写了两个侦听器打开的IMAP文件夹,如下所示:IMAP messageChangedListener()未被触发

IMAPStore imapStore = (IMAPStore) session.getStore("imaps"); 
     imapStore.connect(); 

final IMAPFolder folder = (IMAPFolder) imapStore.getFolder("Inbox"); 
     folder.open(IMAPFolder.READ_WRITE); 

folder.addMessageCountListener(new MessageCountListener() { 

      public void messagesAdded(MessageCountEvent e) { 
       System.out.println("Message Count Event Fired"); 
      } 

      public void messagesRemoved(MessageCountEvent e) { 
       System.out.println("Message Removed Event fired"); 
      } 
     }); 

folder.addMessageChangedListener(new MessageChangedListener() { 

      public void messageChanged(MessageChangedEvent e) { 
       System.out.println("Message Changed Event fired"); 
      } 
     }); 

而且我发送IMAP IDLE命令到服务器在一个单独的线程,如下。

Thread t = new Thread(new Runnable() { 

      public void run() { 
       try { 
        while (true) { 
         folder.idle(); 
        } 
       } catch (MessagingException ex) { 
        //Handling exception goes here 
       } 
      } 
     }); 

     t.start(); 

但问题是“MessageCountListener”在每次发送新邮件或删除邮件时都会触发。但是当邮件发生变化时,“MessageChangedListener”未被触发。

回答

6

JavaMail依靠服务器发送通知。 IMAP规范允许在服务器发送通知时或服务器发送通知时具有相当大的灵活性。更不用说有些服务器不完全符合IMAP规范。您可以打开会话调试并检查协议跟踪以查看服务器是否发送任何通知。

你在使用什么服务器?

+0

非常感谢你的评论香农。我正在使用Gmail帐户进行测试。希望他们提供设施。 –

+1

是的,你是对的。我试着用另一台IMAP服务器,它工作正常。似乎令人惊讶的是,谷歌不提供消息更改通知。任何想法如何解决? –

+1

您会在JavaMail wiki中发现与[使用Gmail与JavaMail](http://kenai.com/projects/javamail/pages/Gmail)相关的一些问题。您还可以在Gmail帮助页面找到[Gmail IMAP实施中的限制]列表(http://support.google.com/mail/bin/topic.py?hl=zh-CN&topic=1668982&parent=1668981&ctx=topic) 。 –

2

我终于得到了解决。

对于Gmail帐户。 您需要设置“通过Gmail设置页面打开新邮件通知” ON。

+1

这并没有改变我的任何行为。 – djechlin