【问题标题】:IMAP - fetching the previous and next UIDsIMAP - 获取上一个和下一个 UID
【发布时间】:2013-12-25 23:21:14
【问题描述】:

使用标准规范 IMAP 命令,我如何根据传递的 UID 确定邮箱中的上一个和下一个 UID,按日期对邮箱消息进行排序,最新的在前?

【问题讨论】:

    标签: email imap


    【解决方案1】:

    我找到了新邮件UID,代码如下。

       @Override
            public void messagesAdded(MessageCountEvent e) {
             try {
                 long newMailUID = ((IMAPFolder) e.getSource()).getUIDNext()
             } catch (MessagingException e1) {
                 e1.printStackTrace();
             }
           }
    

    【讨论】:

    • 问题不是关于UID NEXT,而是关于前一个和下一个uid。
    【解决方案2】:

    假设“按日期对邮箱消息排序,最新在前”是指消息被添加到邮箱的时间,而不是INTERNALDATEDate 标头:

    A001 SEARCH UID 82342
    * SEARCH 83
    A001 OK SEARCH completed
    
    A002 FETCH 82,84 UID
    * FETCH 82 (UID 82309)
    * FETCH 84 (UID 82343)
    A002 OK FETCH completed
    

    注意事项:

    • 如果邮箱中不存在 UID,SEARCH 将不返回任何结果。
    • 如果 UID 与邮箱中的第一条/最后一条消息匹配,请不要尝试获取之前/之后的消息,否则您将收到 BAD 响应。

    如果您不想使用SEARCH,您也可以通过UID FETCH 执行 UID-to-sequence:

    A001 UID FETCH 82342 UID
    * FETCH 83 (UID 82342)
    A001 OK UID FETCH completed
    

    【讨论】:

      【解决方案3】:

      我认为唯一的方法是首先询问所有 UID:

      UID SEARCH ALL
      

      ...然后排序。添加到邮箱的每条消息都被分配了一个比之前添加的消息更高的 UID。

      所以更高的 UID = 更新的电子邮件。

      【讨论】:

      • 是的,这就是我害怕的。原因是这是一个执行起来相当昂贵的命令,主要用于系统的某些用户(阅读:gmail 帐户)将拥有的大型邮箱(10K+ 消息)。我希望有一种更有效的方法来获取这些数据。
      • 一点也不贵。对于有 10399 封电子邮件的邮箱,执行并创建一个 long 列表需要 0,254 秒。至少使用 Mail.dll
      • 是O(整个邮箱),所以对于10339邮件这样的小邮箱当然是很快的。一般来说,最好避免 O(单个邮件)任务的 O(整个邮箱)实现。
      • @arnt 问题是关于上一个和下一个 uid(大概是全部)。
      【解决方案4】:

      如果你想搜索 12345 之前的 UID,这个命令就可以了:

      a UID SEARCH RETURN (MAX) UID 1:12344
      

      寻找下一个之后:

      b UID SEARCH RETURN (MIN) UID 12346:*
      

      这需要大多数现代服务器实现的ESEARCH extension。值得注意的是 gmail 实现了它。但是,在循环中发布有点太昂贵了,所以也许你最好用另一种方式解决你的问题。以下是获取 12345 之前的 50 个 UID 的两个命令序列:

      c1 SEARCH UID 12345
      * SEARCH 1000
      c1 OK done
      c2 UID SEARCH 950:999
      * SEARCH 12200,12202,...
      c2 OK done
      

      950 是“c1 - 50 的结果”,999 是“c1 - 1 的结果”。

      【讨论】:

        【解决方案5】:

        我不熟悉确切的命令,但是您查看过 RFC 吗?

        https://www.rfc-editor.org/rfc/rfc3501

        看起来你可以发送一个 UIDNEXT 命令来为你提供下一个 UID。

        【讨论】:

        • 实际上,我很确定 UIDNEXT 响应仅由指定邮箱上的 SELECT/EXAMINE 命令返回,它指的是将提供给下一条添加的消息的 UID到那个邮箱。我正在寻找邮箱中现有消息的下一个/上一个 UID,相对于传递的 UID。这将在查看消息以启用导航到下一条/上一条消息时实现。
        • UIDNEXT 与 OP 的要求无关。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        • 2013-10-14
        • 2017-07-02
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多