【问题标题】:JavaMail reading recent unread mails using IMAPJavaMail 使用 IMAP 读取最近的未读邮件
【发布时间】:2015-04-25 16:20:13
【问题描述】:

我需要从 Gmail 中检索未读邮件。我正在使用 Java 邮件 API。默认情况下,此 API 从最旧到最新检索邮件。但我需要先检索最近的邮件。可能吗?提前致谢。

【问题讨论】:

    标签: java jakarta-mail imap


    【解决方案1】:

    这里是例子。不要忘记在你的类路径中添加javax.mail

    import javax.mail.*;
    import javax.mail.search.FlagTerm;
    import java.util.*;
    
    public class GmailFetch {
    
      public static void main( String[] args ) throws Exception {
    
        Session session = Session.getDefaultInstance(new Properties( ));
        Store store = session.getStore("imaps");
        store.connect("imap.googlemail.com", 993, "username@gmail.com", "password");
        Folder inbox = store.getFolder( "INBOX" );
        inbox.open( Folder.READ_ONLY );
    
        // Fetch unseen messages from inbox folder
        Message[] messages = inbox.search(
            new FlagTerm(new Flags(Flags.Flag.SEEN), false));
    
        // Sort messages from recent to oldest
        Arrays.sort( messages, ( m1, m2 ) -> {
          try {
            return m2.getSentDate().compareTo( m1.getSentDate() );
          } catch ( MessagingException e ) {
            throw new RuntimeException( e );
          }
        } );
    
        for ( Message message : messages ) {
          System.out.println( 
              "sendDate: " + message.getSentDate()
              + " subject:" + message.getSubject() );
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      确保使用 IMAP 协议,因为它支持标记。

      对您的代码进行以下更改:

      1. 替换 inbox.open( Folder.READ_ONLY ); 经过 inbox.open( Folder.READ_WRITE );
      2. 然后在阅读完消息后,像这样设置标志:

        message.setFlag(Flags.Flag.SEEN, true);
        

      完整示例:

          import javax.mail.*;
          import javax.mail.search.FlagTerm;
          import java.util.*;
      
          public class GmailFetch {
      
            public static void main( String[] args ) throws Exception {
      
              Session session = Session.getDefaultInstance(new Properties( ));
              Store store = session.getStore("imaps");
              store.connect("imap.googlemail.com", 993, "username@gmail.com", "password");
              Folder inbox = store.getFolder( "INBOX" );
              inbox.open( Folder.READ_WRITE );
      
              // Fetch unseen messages from inbox folder
              Message[] messages = inbox.search(
                  new FlagTerm(new Flags(Flags.Flag.SEEN), false));
      
              // Sort messages from recent to oldest
              Arrays.sort( messages, ( m1, m2 ) -> {
                try {
                  return m2.getSentDate().compareTo( m1.getSentDate() );
                } catch ( MessagingException e ) {
                  throw new RuntimeException( e );
                }
              } );
      
              for ( Message message : messages ) {
                System.out.println( 
                    "sendDate: " + message.getSentDate()
                    + " subject:" + message.getSubject() );
                    message.setFlag(Flags.Flag.SEEN, true);
              }
            }
          }
      

      【讨论】:

      • 为什么需要这个?有一个接受的答案是三年前的......
      • 我同意@NicoHaase 的观点,我认为这张海报试图说您应该将 SEEN 标志设置为 true,以便将其标记为已读,以便下次不再请求该消息该程序运行的时间。
      • 如何只获取未读邮件,现在搜索方法似乎不接受Flag了。
      【解决方案3】:

      JavaMail 为您提供一组 Message 对象。消息按接收顺序排列。如果您想首先查看最近收到的消息,请以相反的顺序遍历数组。如果您想首先查看最近发送的消息,则需要对数组进行排序,如另一个答案中所述。

      【讨论】:

      • 我想我知道他的问题是什么。至少这听起来像我的一个:如果您想在用户操作时立即更新屏幕,那么大多数 IMAP 服务器的 FETCH 响应顺序都不好。 “最高UID优先”会比“最低UID优先”更好。但这不是 Javamail 能解决的。
      【解决方案4】:

      我认为这可能有助于访问已读/未读/最近的邮件 根据需要更改变量。

      // search for all "unseen" messages
      
      Flags seen = new Flags(Flags.Flag.SEEN);// try changing this SEEN to RECENT 
      
      // set it true or false for seen & unseen mail
      
      FlagTerm unseenFlagTerm = new FlagTerm(seen, false)
      Message messages[] = inbox.search(unseenFlagTerm);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-13
        • 1970-01-01
        • 2011-07-19
        • 2014-04-27
        • 2017-11-09
        • 2012-05-15
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多